【从头学android】第二个程序同一个Activity中,切换布局时监听器失效解决方法1

来源:互联网 发布:网络舆情监测员职责 编辑:程序博客网 时间:2024/03/29 20:29

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)下个帖子中见详情。