多次调用按钮的 OnClickListener

Posted

技术标签:

【中文标题】多次调用按钮的 OnClickListener【英文标题】:Calling a Button's OnClickListener multiple times 【发布时间】:2018-07-04 00:53:34 【问题描述】:

我在我的应用程序中在两个不同的layouts 中使用了两个buttons 和相同的id,当单击第一个时,应用程序加载第二个layout,当button 与第二个layout 中的相同id 被点击,它加载第一个layout 文件。但是,我的问题是 这种切换只发生一次,之后按钮就没有任何作用。您知道我如何在每次点击每个button 直到用户离开该活动 时调用这些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());


【问题讨论】:

一旦布局被交换回来,你永远不会重新设置第一个按钮的点击监听器(第一个按钮的点击监听器在第一次切换视图消失后不再存在)。跨度> @pushasha 如何在不写入另一个 onClickListener 块的情况下重置它? 【参考方案1】:

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

我没有对此进行测试,但它似乎在理论上应该有效。尝试将侦听器定义为您班级的私有成员,然后将其设置在您的 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;
    

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

【讨论】:

谢谢,这解决了我的问题(必须做一些更正/提交编辑)。我应该考虑递归地执行此操作:(。我不知道我可以将 Listener 作为成员变量,感谢您提供的信息;)。最佳答案

以上是关于多次调用按钮的 OnClickListener的主要内容,如果未能解决你的问题,请参考以下文章

长按多次调用 UIButton 的动作

Azure 函数 - 防止多次调用

如何多次调用动画的函数[重复]

Windows 应用程序 - 自定义事件被多次调用

SKPaymentTransactionStatePurchased 多次调用错误

Swift Xib UiView BottomSheet 被多次调用