2010-11-13 42 views
2

我遇到以下代码的问题,我创建了两个添加了onClickListener的按钮。onClickListener中的代码无法执行

它工作正常的按钮 - btnAbout,我试图用另一种方式来处理btnIntro,而不是使用findViewById(...)方法,但是当我单击btnIntro时语句不会被执行。

为什么会发生这种情况?

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; 
import android.widget.Toast; 

public class TestActivity extends Activity { 
    private final String TAG = "tag"; 
    private Button btnIntro; 
    private Button btnAbout; 
    private View layoutView; 
    private ViewWrapper wrapper; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     btnAbout = (Button) findViewById(R.id.btnAbout); 
     if (btnIntro == null) { 
      LayoutInflater inflator = getLayoutInflater(); 
      layoutView = inflator.inflate(R.layout.main, null, false); 
      wrapper = new ViewWrapper(layoutView); 
      layoutView.setTag(wrapper); 

     } else { 
      wrapper = (ViewWrapper) layoutView.getTag(); 
     } 

     btnIntro = wrapper.getButton(); 
     Log.e(TAG, Integer.toHexString(layoutView.getId()) + ""); 
     Log.e(TAG, btnIntro.getText().toString()); 

     btnIntro.setOnClickListener(new OnClickListener() { 
      { 
       Log.e(TAG, "static"); 
      } 

      @Override 
      public void onClick(View arg0) { 
       Log.e(TAG, "btnIntro clicked"); 
       Toast.makeText(TestActivity.this, "btnIntro", Toast.LENGTH_SHORT) 
        .show(); 
      } 
     }); 

     btnAbout.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 
       Log.e(TAG, "btnAbout clicked"); 
       Toast.makeText(TestActivity.this, "about", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

    class ViewWrapper { 
     View base; 
     Button btn1; 

     ViewWrapper(View base) { 
      this.base = base; 
     } 

     Button getButton() { 
      if (btn1 == null) { 
       btn1 = (Button) base.findViewById(R.id.btnIntro); 
       Log.e(TAG, btn1.getText().toString()); 
      } 
      return btn1; 
     } 
    } 
} 

main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/MAIN_LAYOUT_XML" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="30dip"> 
    <TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Test" /> 
    <Button 
    android:id="@+id/btnIntro" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="btnIntro" /> 
    <Button 
    android:id="@+id/btnAbout" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="btnAbout" /> 
</LinearLayout> 
+0

请解释您通过不使用findViewById方法可以获得什么。另外,由于layoutView被定义为一个View类型,所以ViewWrapper类应该扩展View。 – user432209 2010-11-13 13:41:06

回答

0

问题是,使用不同的内容的观点,以获得按钮,一个在创建时调用的setContentView()和第二你通过调用inflator.infate创建() 。因此,您得到的按钮被放置在不同的内容视图中(只显示其中的一个 - 由setContentView创建)。尝试改为:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    LayoutInflater inflator = getLayoutInflater(); 
    layoutView = inflator.inflate(R.layout.main, null, false); 
    setContentView(layoutView); 
    //..anything you need.. 
} 
+0

感谢您的解释,现在工作正常,我从中学到了很多东西。 :-) – jerry 2010-11-14 04:51:03

+0

不客气。 – 2010-11-14 09:40:01