2022/4/2 APP开发02-初级控件和探究活动

日期:Mar-1-2022

作者:狐狸大剑眼镜

参考书籍:《第一行代码 Android第二版》陈建林

android+studio开发实战:从零基础到App上线 欧阳燊,念shēn

本来需要静态分析一个应用违规收集个人隐私的,结果它加壳了,FlowDroid不能分析加壳程序,脱壳我还不会,师傅给我脱壳之后,我连source和sink都找不到,自己学习写一个样本吧。
路曼曼其修远兮,吾将上下而求索(●'◡'●)

线性布局LinearLayout

Android中所有的控件都具有这两个属性,可选值有3种:match_parent、fill_parent、wrap_content.

其中match_parent和fill_parent的意义相同,但官方更推荐match_parent.

match_parent表示让当前控件的大小和父布局的大小一样,也就是由父布局来决定当前控件的大小

wrap_content表示让当前的控件大小能够刚好包含里面的内容,也就是由控件内容决定当前控件的大小
原文链接:https://blog.csdn.net/qq_38900441/article/details/83420480

布局

布局LinearLayout作为根元素,我们添加一个按钮

    <Button
        android:id="@+id/button_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="点击抽奖"/>

@id/button_1是XML中引用语法,如果在XML中定义一个id就要使用@+id/button_1这种语法,android:layout_width="match_parent"中"match_parent"代表当前元素和父元素一样宽, android:layout_height="wrap_content"中"wrap_content"代表高度刚好能包住字就行。

加载布局

写好之后就可以在Mactivity中加载布局,

public class MainActivity extends AppCompatActivity {
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("MainActivity", "onCreate: hello");
    }
}

MainActivity extends 继承AppCompatActivity(AppCompatActivity是Activity的子类),Activity是android系统提供的活动基类,我们所有活动都必须继承它或者它的子类才能拥有活动特性。
如果要调用父类的构造方法,可以使用 super 关键字。super 可以用来访问父类的构造方法、普通方法和属性。

调用了 setContentView()方法来给当前活动加载一个布局,而在 setContentView()方法中我们一般都会传入一个布局文件id, 项目中添加任何资源都会在R文件中生成一个相应的id,只需要调用R.layout.activity_main,就会得到activity_main.xml文件的布局id。

活动注册

所有的活动都要在AndroidManifest.xml中注册才能生效,活动的注册声明需要放在标签内,在标签内使用android:name来指具体注册哪一个活动,填入的".MainActivity"其实就是包名的缩写。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

仅仅是注册了活动,我们的程序仍然是不能运行的,还没有为程序配置主活动,也就是说,当程序运行起来的时候不知道先启动哪个活动,在标签内部加入标签,加入 下面两句声明就可。

<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

我们还可以使用android:label 指定标题栏的内容,标题栏是显示在活动最顶部的,需要注意的是指定主活动的label不仅是标题栏的内容还是启动器中应用程序显示的名称。

android:exported = true

在Activity中该属性用来标示:当前Activity是否可以被另一个Application的组件启动:true允许被启动;false不允许被启动。
android:exported 是Android中的四大组件 Activity,Service,Provider,Receiver 四大组件中都会有的一个属性。主要功能是否支持其它应用调用当前组件

手动狗头(o゜▽゜)o☆[BINGO!]

在活动中使用Toast

Toast可以将短小的信息通知给用户,信息会在一段时间后自动消失,并且不会占用屏幕空间

public class MainActivity extends AppCompatActivity {

    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        
        Button button1 = (Button) findViewById(R.id.button_1);
        Button button2 = (Button) findViewById(R.id.button_2);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this,"您参加了此活动,请等待中奖通知",
                        Toast.LENGTH_SHORT).show();
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "已经增加了中奖几率",
                        Toast.LENGTH_SHORT).show();
            }
        });

    }
}

使用findViewById()方法获取到在布局文件中定义的元素,这里传入button_1和button_2来获取到按钮的实例,这个值就是activity_main.xml中通过android:id属性来指定的。findViewById()方法返回的是一个View对象,我们需要向下转型将它转成Button对象,得到按钮实例后,用setOnClickListener方法注册一个监听器,点击按钮就会执行监听器的onClick()方法,因此弹出Toast的功能当然是要在 onClick()方法中编写啦。

Toast通过makeText()创建一个Toast对象,然后调用show()将Toast显示出来就可以了,makeText()方法需要传递三个参数,第一个参数是context,就是Toast要求的上下文,,由于活动本身就是Context对象,直接传入 MainActivity.this就行,第二个参数是文本,第三个参数是Toast显示时长,可以选择Toast.LENGTH_SHORT,Toast.LENGTH_LONG。

菜单

在res目录下创建一个menu文件夹,New-Directory,在这个文件夹下再新建一个名叫main的菜单文件,右击menu文件夹-New-Menu resource file

添加如下代码

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/gps_item"
        android:title="位置"/>
    <item
        android:id="@+id/sh_item"
        android:title="摄像头"/>

</menu>

ctrl+O重写onCreateOptionsMenu()方法

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main,menu);
        return true;
    }

只有显示还不够,给他加点响应事件,重写 onOptionsItemSelected()方法

   
// 忽略我的文字,写着玩。
public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.gps_item:
                Toast.makeText(this,"以获取精确位置",Toast.LENGTH_SHORT).show();
                break;
            case R.id.sh_item:
                Toast.makeText(this,"以获取嫌疑人头像",Toast.LENGTH_SHORT).show();
                break;
            default:
        }
        return true;
    }

getItemId()来判断我们点击的是哪个菜单项。

销毁活动

返回键直接退出程序,使用代码就是finish(),按钮2退出当前活动

        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }

日志java

过滤器:

点击Edit Filter Configuration 添加自定义过滤器


日志级别控制:

Verbose代表最低级,哪个方法打印日志都会显示 出来,选择debug,使用debug级别以上的方法才会显示出来。

关键词过滤:

输入关键词快速过滤想看的内容。

posted @   狐狸大剑眼镜  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示