Как перезапустить onclicklistener после переключения раскладок - PullRequest
0 голосов
/ 13 января 2019

Я только начал программировать в AndroidStudio и Java, поэтому пока не очень разбираюсь. По сути, когда я щелкаю на кнопкеdrawBtn, он переключается на другой макет, а затем, когда я щелкаю, он должен переключаться обратно на макет Activity_main. Проблема в том, что, как только я вернулся в раскладку Activity_main, нажатие на «drawBtn »больше ничего не делает. Как я могу это исправить, чтобы он работал, как только я вернулся к основному макету.

withdrawBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    setContentView(R.layout.popup_window);
    text = (TextView) findViewById(R.id.textView);
    RelativeLayout rlayout = (RelativeLayout) findViewById(R.id.popup);
    rlayout.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
        setContentView(R.layout.activity_main);
        return true;
        }
    });

1 Ответ

0 голосов
/ 13 января 2019

Причина, по которой drawBtn больше не работает, заключается в том, что вы снова надуваете макет при нажатии кнопки.

Что сейчас происходит:

  1. В исходном действии вы надули R.layout.activity_main и установили withdrawBtn.setOnClickListener() после того, как этот макет был накачан.
  2. Вы надуваете R.layout.popup_window, и это фактически заменяет все из предыдущего макета новым макетом.
  3. Вы установили rlayout.setOnTouchListener() и переключили его на предыдущий макет.

Однако имейте в виду, что вы заменяете старые макеты новыми макетами ... так что все setOnClickListeners и setOnTouchListeners фактически исчезли. Вот почему ваш drawBtn больше не работает. Это потому, что у него больше нет onClickListener. Чтобы это исправить, вы просто должны добавить к нему onClickListener.

ОДНАКО, хотя это решение вашего вопроса, я ДОЛЖЕН указать, что ваш способ навигации по вашему приложению - ОГРОМНАЯ проблема.

НЕ ПРОДОЛЖАЙТЕ ТО, ЧТО ВЫ ДЕЛАЕТЕ.

То, как вы раздуваете макеты при нажатии кнопки, не означает, что Android предназначен для открытия новых экранов. Постоянно раздувая новый макет, вы по существу игнорируете весь предыдущий код, предназначенный для этого макета ... который может легко вызвать сбои из-за обращения к коду, который больше не существует.

В некотором смысле вы делаете свой код более запутанным, чтобы достичь результата, который дает вам неэффективные и потенциально ошибочные результаты.

Для Android на самом деле есть два часто используемых решения для перехода на новые экраны:

  1. Начать новое действие - Вы можете создавать несколько действий в своем приложении. Каждое действие должно раздуть ровно один макет. Если у вас есть MainActivity и PopUpWindowActivity, вы можете просто использовать startActivity(new Intent(MainActivity.this, PopUpWindowActivity.class));, чтобы открыть новое действие PopupWindow. Когда вы закончите с PopupWindowActivity, вы можете просто вызвать finish();, чтобы закрыть это действие и вернуться к MainActivity. При желании вы также можете использовать startActivity(), чтобы вернуться к MainActivity, если не хотите закрывать PopUpWindowActivity. Вот больше информации об этом: https://developer.android.com/training/basics/firstapp/starting-activity#java
  2. Использовать одно действие с несколькими фрагментами - Аналогично, каждое действие и фрагменты должны наполнять только один макет. Тем не менее, общая концепция вокруг фрагментов слишком много, чтобы объяснить простыми словами, поэтому читайте больше об этом здесь: https://developer.android.com/guide/components/fragments

Старайтесь не использовать setContentView() более одного раза для каждого занятия и делайте это только в том случае, если нет другого выбора ... что я могу с уверенностью сказать со 100% уверенностью, что всегда есть лучший вариант.

...