android - onClickListener 中的代码无法执行

标签 android

我在使用以下代码时遇到问题,我创建了两个添加了 onClickListener 的按钮。

对于 Button -- 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;
        }
    }
}

主.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>

最佳答案

问题是您使用不同的内容 View 来获取按钮,一个是在调用 setContentView() 时创建的,第二个是通过调用 inflator.infate() 创建的。因此,您获得的按钮被放置在不同的内容 View 中(仅显示其中一个 - 由 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..
}

关于android - onClickListener 中的代码无法执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4172508/

相关文章:

android - 如何在android中编码和解码表情符号?

android - 从 PreferenceScreen 启动 Activity

java - 在 Android Studio 中更改使用 renderManager 的应用程序中的字体

android - 中文语言环境值-zh_CN 在 Eclipse 上报错

Android - 检测 RecyclerView 中的最后一个项目何时可见

android - 如何在 Android 运行时导入共享对象库?

android - 如何以编程方式从 Android 中的 .vcf 文件导入或插入联系人?

android - ImageView 不显示图像钛

android - mdpi 设备的自定义 dimens.xml - 如何完成?

android - 如何使用 azure pipeline 生成 .AAB 文件并签署 Android 应用程序包