如题,在xml中布局了两个界面a,b,在主界面a通过button1与切面b切换,再从b中通过backbutton返回a,多次重复都没有问题,但第一次从b返回到a后,a中原先定义的其余button的监听都失效了,这是为啥呢?求高人解答!谢谢!我是用如下方式切换的
public class A extends Activity {
public void onCreate(Bundle savedInstanceState) {
      ...
      Button01.setOnClickListener(new Button.OnClickListener()
        {
          public void onClick(View v)
          {
           jumpToLayoutb();
          }
        });
       ...
 } 定义其它的button监听
}
//Convert to layout a
    public void jumpToLayouta(){
        setContentView(R.layout.a);
        Button01 = (Button) findViewById(R.id.mybutton01);
        Button01.setOnClickListener(new Button.OnClickListener(){
        public void onClick(View v) {
         jumpToLayoutb();
        }
        });
        }
     //Convert to layout b
     public void jumpToLayoutb(){
        setContentView(R.layout.b);
        Button backbutton = (Button)findViewById(R.id.mybackbutton);
        backbutton.setOnClickListener(new Button.OnClickListener(){
        public void onClick(View v) {
         jumpToLayouta();
        }
        });
        }

解决方案 »

  1.   

    当你切回去的时候,所有的View对象都重新创建了。没有为新创建的View注册监听。你不应该使用这个函数到更新Layout
    public void  setContentView  (int layoutResID)应该使用
    public void  setContentView  (View view)在OnCreate时,你需要首先把layout资源变为View对象。
    可以看看LayoutInflater
      

  2.   

    哦。。那接着楼上再问两个问题:
    1.setContentView (int layoutResID)会创建一个新的对象,是不是意味着有创建了一个activity?
    2.那原来的那个view对象绑定的activity是否还有可能在task栈上呢?若可能的话是不是长久下去此方法会引起系统资源紧张?望继续给小弟解惑,谢了
      

  3.   

    不会创建新的Activity,只是创建了新的View树。LayoutInflater flater = this.getLayoutInflater();
    View viewa = flater.inflate(R.layout.a, null); 
    View viewb = flater.inflate(R.layout.b, null); 
      

  4.   

    当然失效了,因为还是同一个activity,但是view变了。需要重新注册一遍onClickListener.
      

  5.   

    还是不行啊,修改如下,程序在模拟器上起不来,是放的位置不对还是别的原因?
    public class A extends Activity {
    public void onCreate(Bundle savedInstanceState) {
      ...
      Button01.setOnClickListener(new Button.OnClickListener()
      {
      public void onClick(View v)
      {
      jumpToLayoutb();
      }
      });
      
    LayoutInflater flater = this.getLayoutInflater();
    View viewa = flater.inflate(R.layout.a, null);  
    View viewb = flater.inflate(R.layout.b, null);

      ...
     }
      

  6.   

    我试过了  没问题啊  监听不会失效
    package com.zc.viewchange;import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.Button;public class ViewChange extends Activity {

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN;
            Window myWindow = this.getWindow();
            myWindow.setFlags(flag, flag);
            setContentView(R.layout.main);
            Button b1=(Button) findViewById(R.id.btn1);
            b1.setOnClickListener(new Button.OnClickListener() {
             public void onClick(View v)
             {
             jumpView2();
             }
            });
        }
        
        public void jumpView2()
        {
         setContentView(R.layout.view2);
         Button b2 = (Button) findViewById(R.id.btn2);
         b2.setOnClickListener(new Button.OnClickListener() {
         public void onClick(View v)
         {
         jumpView1();
         }
         });
        }
        public void jumpView1()
        {
         setContentView(R.layout.main);
         Button b1 = (Button) findViewById(R.id.btn1);
         b1.setOnClickListener(new Button.OnClickListener() {
         public void onClick(View v)
         {
         jumpView2();
         }
         });
        }
        
    }
      

  7.   

    7楼你在view1里多加几个button试试看 无效了,除非你把所有button的onclick设置都加到jumpView1中
      

  8.   

    使用ViewStackActivity,新鲜出炉:
    http://blog.csdn.net/dyw/archive/2010/09/28/5912011.aspx
      

  9.   

    楼主的问题解决了么,  我做了一个播放器播放界面的切换  也遇到了和楼主一样的问题看了9楼的  改了代码   运行程序出现错误:Unfortunately,音乐播放器 has stoped运行不了 怎么办
      

  10.   

    package com.ritterliu.android;import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;public class ActivityTestActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
           // setContentView(R.layout.main2);
            
            Log.d("avtivity","onCreate()");
            
            LayoutInflater inflater = getLayoutInflater();    
            final View main = inflater.inflate(R.layout.main,null);
            final View main2 = inflater.inflate(R.layout.main2,null);
                    
            Button btn1=(Button)main.findViewById(R.id.btn1);
            btn1.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Log.d("Activity","press btn1");
                    setActivityView(main2);
                }        });
            
            Button btn2=(Button)main2.findViewById(R.id.btn2);
            btn2.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Log.d("Activity","press btn2");
                    setActivityView(main);
                }
            });        //setContentView(R.layout.main);
            setActivityView(main);
        }
        
        public void setActivityView(View view)
        {
            this.setContentView(view);
        }
        
    }这样是可以的,感觉主要是要把setContentView()的参数改成view,不能用id
    完整下载