>

두 개의 buttons 를 사용하고 있습니다  같은 id 와 함께  두 개의 다른 layouts 에서  내 응용 프로그램에서 첫 번째 응용 프로그램을 클릭하면 두 번째 layout 가로 드됩니다.  때 button  같은 id 와 함께  두 번째 layout 에서  클릭하면 첫 번째 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());
}
}


  • 답변 # 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;
        }
    }
    
    

    논리가 잘못된다면 죄송합니다.이 경우의 핵심은 말하기 방식으로 클릭 리스너를 "재귀 적으로"설정하여 리스너가 클릭 할 때마다 설정되도록하는 것입니다.

관련 자료

  • 이전 d3.js - 임의의 색상 - 채우기 속성에 대한 함수를 반환
  • 다음 multithreading - 스레드 내에서 실행중인 두 객체가 Java로 통신하도록하려면 어떻게해야합니까?