前言
最近在写一个Demo,需要在首页上添加多个按钮,每个按钮点击后跳转到其他的Activity,写一下思路和总结。
页面布局
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="这是一个综合案例APP"
android:gravity="center"
android:layout_marginTop="10dp"
android:textSize="15sp"
android:textColor="@color/black">
</TextView>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<GridLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:rowCount="4"
android:columnCount="4"
>
<Button
android:id="@+id/one"
android:layout_width="0dp"
android:text="按钮"
android:layout_margin="10dp"
android:layout_columnWeight="1"
android:onClick="showtoast"
>
</Button>
<Button
android:id="@+id/two"
android:layout_width="0dp"
android:text="按钮"
android:layout_margin="10dp"
android:layout_columnWeight="1"
>
</Button>
<Button
android:id="@+id/three"
android:layout_width="0dp"
android:text="按钮"
android:layout_margin="10dp"
android:layout_columnWeight="1"
>
</Button>
</GridLayout>
</ScrollView>
</LinearLayout>
页面分析:
最外层的LinearLayout包裹,纵向排列,里面有TextView和ScrollView
TextView宽度撑满,高度自适应内容高度,距离顶部10dp,字体大小15sp,gravity文字相对于布局居中(字体相对于TextView)
GridLayout宽度撑满,高度撑满,声明rowCount和columnCount为4,也就是4行4列,
GridLayout
的布局机制是先填充列,再换行Button宽度0dp,高度自适应,layout_columnWeight设置平分行宽度,一定要设置layout_width="0dp",否则Weight权重失效
页面效果:
基础点击事件逻辑
通过Id方式增加Click方法
通过button上的android:onClick="showtoast",给button添加点击方法,这是基础的方式;
public void showtoast (View view){
Toast.makeText(MainActivity.this, "按钮被点击了", Toast.LENGTH_SHORT).show();
}
但是这种方最简单便捷,但是不好维护使用,定义的方法不知道对应的哪个点击,实际开发中不建议使用‘
通过Java注册事件监听器
通过button上的Id,给按钮添加点击事件监听。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn1 = findViewById(R.id.one);
btn1.setOnClickListener(new MyOnClickListener());
}
private class MyOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "按钮被点击了", Toast.LENGTH_SHORT).show();
}
}
}
分析代码:
findViewById获取按钮
给按钮添加一个事件监听,setOnClickListener,这里使用的是声明类MyOnClickListener,这个类实现了接口View.OnClickListener
MyOnClickListener重写onClick方法
封装
匿名类
如果一个页面有多个按钮,点击的事件逻辑也基本相同,每次都需要写重复代码,这显然不合适,可以把点击的事件逻辑逻辑抽离处理封装成一个类,通过方法名执行不同的逻辑处理,上面使用的是声明类,也可以使用匿名类的方式简化代码
NavigationUtils.java
public class NavigationUtils {
/**
* Toast
* @param context 当前上下文
*/
public static void showtoast(Context context) {
Toast.makeText(context, "按钮被点击了", Toast.LENGTH_SHORT).show();
}
/**
* 跳转到目标 Activity
* @param context 当前上下文
* @param targetActivityClass 目标 Activity 的 Class
*/
public static void navigateTo(Context context,Class<?> targetActivityClass) {
Intent intent = new Intent(context, targetActivityClass);
context.startActivity(intent);
}
/**
* 带参数的跳转
* @param context 当前上下文
* @param targetActivityClass 目标 Activity
* @param extras 传递的 Bundle 数据
*/
public static void navigateWithExtras(Context context, Class<?> targetActivityClass, Bundle extras) {
Intent intent = new Intent(context, targetActivityClass);
intent.putExtras(extras);
context.startActivity(intent);
}
}
MainActivity.java
Button btn1 = findViewById(R.id.one);
// 匿名类
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NavigationUtils.showtoast(MainActivity.this);
}
});
Lambda 表达式写法
Button btn1 = findViewById(R.id.one);
btn1.setOnClickListener(v -> NavigationUtils.showtoast(MainActivity.this));
在 Android 开发中,Lambda 表达式可以大幅简化 setOnClickListener
的代码,使代码更简洁易读。
评论区