【从头学android】第二个程序同一个Activity中,切换布局时监听器失效解决方法1
16lz
2021-01-23
1.java程序
/** * */package com.itest;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;/** * @author Robin */public class ITestP1Activity extends Activity {Button b1;Button b2;/** Called when the activity is first created. */@Overridepublic void onCreate( Bundle savedInstanceState ){super.onCreate( savedInstanceState );setContentView( R.layout.p11 );//查找控件b1 = (Button) findViewById( R.id.button1 );//设置监听b1.setOnClickListener( new OnClickListener() {@Overridepublic void onClick( View v ){jumpToDevicelistB1();}} );}void jumpToDevicelistB1(){setContentView( R.layout.p12 );//查找控件b2 = (Button)findViewById( R.id.button1 );//设置监听b2.setOnClickListener( new OnClickListener() {@Overridepublic void onClick( View v ){jumpToMainB2();}});}void jumpToMainB2(){setContentView( R.layout.p11 );//必须重新查找控件,否则监听不生效b1 = (Button) findViewById( R.id.button1 );//必须重新设置监听b1.setOnClickListener( new OnClickListener() {@Overridepublic void onClick( View v ){jumpToDevicelistB1();}} );}}
2.p11.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="fill_parent"><TextView android:id="@+id/textView1" android:text="p11"android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView><Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/changeText"></Button></LinearLayout>
3.p12.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="fill_parent"><TextView android:id="@+id/textView1" android:text="p12"android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView><Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/changeText"></Button></LinearLayout>
需要注意的是
1.在同一个Activity里切换布局容易出现控件监听失效的问题
原因是setContentView(int)方法是从布局文件中重新载入,所有动态设定都会失效。
解决方法重新执行oncreate里的方法进行初始化。
代码简化如下:
/** * */package com.itest;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;/** * @author Robin */public class ITestP1Activity extends Activity {Button b1;Button b2;/** Called when the activity is first created. */@Overridepublic void onCreate( Bundle savedInstanceState ){super.onCreate( savedInstanceState );initP11();}void initP11(){setContentView( R.layout.p11 );// 查找控件b1 = (Button) findViewById( R.id.button1 );// 设置监听b1.setOnClickListener( new OnClickListener() {@Overridepublic void onClick( View v ){initP12();}} );}void initP12(){setContentView( R.layout.p12 );// 查找控件b2 = (Button) findViewById( R.id.button1 );// 设置监听b2.setOnClickListener( new OnClickListener() {@Overridepublic void onClick( View v ){initP11();}} );}}
2.上述代码切换布局的时候会丢失对布局的动态修改(即切换后载入的是原始布局)
原因同上
解决办法使用setContentView(View)下个帖子中见详情。
更多相关文章
- Unity Android IL2CPP 编译报错的一种可能原因
- [Android]ButterKnife-无尽之刃-绑定视图控件和事件的快速开发工
- Android布局总结一:GridLayout布局(网格布局)
- android UI学习 -- 设置界面的布局(包括style的使用,selector的
- 【Android】界面布局之TableLayout(表格布局)
- Android布局编写示例【慢慢更新】
- Android 布局优化之include与merge
- 线性布局(LinearLayout)下layout_weight用法分析
- Android 布局(LinearLayout\TableLayout\RelativeLayout\Absol