java - 多次调用 Button 的 OnClickListener

标签 java android android-layout android-studio button

我在我的应用中使用两个具有相同 idbutton 在两个不同的 layout 中,当第一个被点击时,应用程序加载第二个 layout,当第二个 layout 中具有相同 idbutton 被点击时,它加载第一个 layout 文件。但是,我的问题是这种切换只会发生一次,之后按钮不会执行任何操作。您是否知道我如何在单击每个 button 直到用户离开该 activity 时调用这些 onClickListeners

CardViewActivity.java:

public class CardViewActivity extends AppCompatActivity {

private ImageView cardArtImageView;
private TextView leaderSkillDescText;
private TextView superAttackTitleText;
private TextView superAttackDescText;
private TextView passiveSkillTitleText;
private TextView passiveSkillDescText;
private TextView hpText;
private TextView attText;
private TextView defText;
private TextView costText;
private Button arrowButton;

private int selectedItemPosition;
private boolean isBtnClicked = false;

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

    // Retrieving the data sent over from MainActivity
    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();

    if (bundle != null) {
        selectedItemPosition = bundle.getInt("Card Index");
    }
    //Toast.makeText(this, "WIDTH: " + SCREEN_WIDTH, Toast.LENGTH_SHORT).show();

    // Initializing our views
    cardArtImageView = findViewById(R.id.cardArtImageView);
    viewDefinitions(false);
    setSelectedViewsInit();

    initCardViewData(selectedItemPosition);

    arrowButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            isBtnClicked = !isBtnClicked;
            if (isBtnClicked) {
                setContentView(R.layout.cardview_expand_details);
                viewDefinitions(true);
                initCardViewData(selectedItemPosition);
                setSelectedViewsInit();
                Log.d("BTN", "Btn Clicked 1st time");
                arrowButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        setContentView(R.layout.cardview_refined);
                        cardArtImageView = findViewById(R.id.cardArtImageView);
                        viewDefinitions(false);
                        initCardViewData(selectedItemPosition);
                        setSelectedViewsInit();
                        isBtnClicked = !isBtnClicked;
                        Log.d("BTN", "Btn Clicked 2nd time");
                    }
                });
            }
        }
    });
}

/**
 * Sets the required textViews as selected to allow automatic scrolling
 */
private void setSelectedViewsInit() {
    leaderSkillDescText.setSelected(true);
    superAttackTitleText.setSelected(true);
    superAttackDescText.setSelected(true);
    if (passiveSkillTitleText != null && passiveSkillDescText != null) {
        passiveSkillTitleText.setSelected(true);
        passiveSkillDescText.setSelected(true);
    }
}

/**
 * Adds the views's definitions
 *
 * @param initPassiveInfo used to decide whether or not the passiveSkillDesc & ..Title != null
 *                        so that they can be defined
 */
private void viewDefinitions(boolean initPassiveInfo) {
    leaderSkillDescText = findViewById(R.id.leaderSkillDesc);
    superAttackTitleText = findViewById(R.id.superAttackTitle);
    superAttackDescText = findViewById(R.id.superAttackDesc);
    if (initPassiveInfo) {
        passiveSkillTitleText = findViewById(R.id.passiveSkillTitle);
        passiveSkillDescText = findViewById(R.id.passiveSkillDesc);
    } else {
        Log.d("Definitions", "Passive info == null");
    }
    hpText = findViewById(R.id.HP);
    attText = findViewById(R.id.ATT);
    defText = findViewById(R.id.DEF);
    costText = findViewById(R.id.COST);
    arrowButton = findViewById(R.id.arrowButton);
}

/**
 * Initialize the cardViewActivity's views with the data from the CardInfoDatabase.java class
 *
 * @param selectedItemPosition Used to initialize this activity's views if the intent was called from the MainScreen Fragment
 */
private void initCardViewData(int selectedItemPosition) {
    if (cardArtImageView != null) {
        cardArtImageView.setImageResource(CardInfoDatabase.cardArts[selectedItemPosition]);
    }
    leaderSkillDescText.setText(CardInfoDatabase.leaderSkills[selectedItemPosition]);
    superAttackTitleText.setText(CardInfoDatabase.superAttacksName[selectedItemPosition]);
    superAttackDescText.setText(CardInfoDatabase.superAttacksDesc[selectedItemPosition]);
    if (passiveSkillTitleText != null && passiveSkillDescText != null) {
        passiveSkillTitleText.setText(CardInfoDatabase.passiveSkillsName[selectedItemPosition]);
        passiveSkillDescText.setText(CardInfoDatabase.passiveSkillsDesc[selectedItemPosition]);
    }
    hpText.setText(CardInfoDatabase.hp[selectedItemPosition].toString());
    attText.setText(CardInfoDatabase.att[selectedItemPosition].toString());
    defText.setText(CardInfoDatabase.def[selectedItemPosition].toString());
    costText.setText(CardInfoDatabase.cost[selectedItemPosition].toString());
}
}

最佳答案

为避免此问题,您需要确保分配给按钮的 OnClickListener 始终为"new"中的按钮设置 OnClickListener布局

我还没有对此进行测试,但它似乎在理论上应该可行。尝试将监听器定义为类的私有(private)成员,然后在 onCreate 中设置它,例如 arrowButton.setOnClickListener(arrowClickListener);:

private void arrowClickListener = new View.OnClickListener(){
    @Override
    public void onClick(View view) {
        // clicked buttton -- pick layout based on button "state"
        int resId = isBtnClicked ? R.layout.cardview_expand_details : R.layout.cardview_refined;

        // set the contentview with the layout we determined earlier
        setContentView(resId);

        // If we're in the "normal" view, find the card art view and set our field to it
        if (!isBtnClicked){
            cardArtImageView = findViewById(R.id.cardArtImageView);
        }

        // do other initialization stuff
        viewDefinitions(isBtnClicked);
        initCardViewData(selectedItemPosition);
        setSelectedViewsInit();

        // set our new arrow button click listener to this listener
        arrowButton.setOnClickListener(arrowClickListener);

        // toggle button flag
        isBtnClicked = !isBtnClicked;
    }
}

抱歉,如果我的某些逻辑有误 - 在这种情况下,关键是以某种方式“递归”设置点击监听器,以确保在每次点击后设置一个监听器。

关于java - 多次调用 Button 的 OnClickListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48431609/

相关文章:

android - 如何从膨胀的布局中访问 View ?

java - 如果我们可以使 ArrayList 同步,那么 Vector 还需要什么?

java - 函数陷入循环

android - 如何在表中创建外键?

Android float 操作按钮选项菜单

克隆后 Android Studio 布局编辑器不起作用

java - 使用 Windows Auth 到 SQL 2014 命名实例的 JDBC 连接字符串

java - 如何修复 Maven 和 Jacoco 的特定版本问题?

java - 在 Android 设备上运行 root 命令

android - 包裹 : unable to marshal value