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中注册才能生效,活动的注册声明需要放在
<?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级别以上的方法才会显示出来。
关键词过滤:
输入关键词快速过滤想看的内容。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效