多次调用按钮的 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的主要内容,如果未能解决你的问题,请参考以下文章