Как реализовать startActivity () внутри метода OnClick () отдельного класса Java?

Итак, я сделал три 3 файла java.

  1. основной вид деятельности
  2. ButtonListener.java (отдельный класс java)
  3. PurpleActivty.class (активность)

Я реализовал метод OnclickListener и OnClick внутри своего файла ButtonListener.java.

Я хочу запустить намерение startActivity () внутри моего onClick (View v) файла ButtonListener. Но это вызывает ошибку в строке startActivity ().

Я знаю, что могу создать метод OnClick в onCreate из AvtivityClass, но я не хочу этого делать, поскольку я создал отдельный файл java, который может обрабатывать все мои слушатели кнопок.

Файл MainActivity.java

public class MainActivity extends AppCompatActivity  {

   public Button intentPurple;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        intentPurple=findViewById(R.id.button5);
       Intent gg= new Intent(MainActivity.this, PurpleActivty.class);
        ButtonListener B= new ButtonListener(gg);

        intentPurple.setOnClickListener(B);

    }

}

файл ButtonListener.java

public class ButtonListener  implements View.OnClickListener {
     private Intent g;


    public ButtonListener(Intent F) {

        this.g=F;
    }
 @Override

        public void onClick(View v) {
            switch(v.getId()) {

                case R.id.button5:

          startActivity(g);  // this line is error(red underline g) error msg
           break;            //is "startActivity() in ContextCompat cannot be 
                            //applied to"
            }}}

Есть ли способ решить эту проблему?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
255
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я верю в

public ButtonListener(Intent F) {

    this.g=F;
}

вам не обязательно использовать это, потому что имена переменных разные. Помимо этого, я считаю

 Intent gg= new Intent(**MainActivity.this**, PurpleActivty.class);

MainActivity.this вызывает проблему, поскольку вы находитесь в другом классе, вам также следует передать контекст MainActivity в качестве параметра и использовать

 context.startActivity(g);

ИЛИ ЖЕ

view.getContext().startActivity(g);

public ButtonListener (Intent F) должен передать значение intent obj в конструктор общедоступного ButtonListener без него ButtonListener не получит значение intent obj для запуска Startactivity (obj)

Esla Baeny 20.05.2018 11:52

context.startActivity (openThree) ... что вы имеете в виду под openThree?

Esla Baeny 20.05.2018 11:53

говоря "вам не нужно использовать это", я не имел в виду, что вам не нужно использовать конструктор, но они сами задают ключевое слово this.

Chris Fodor 20.05.2018 11:54
Ответ принят как подходящий

Вам нужно вызвать startActivity из контекста действия, а не из вашего пользовательского класса обработчика. Выполните рефакторинг ButtonListener так:

public class ButtonListener implements View.OnClickListener {
    private Intent g;
    private Context caller;

    public ButtonListener(Intent f, Context caller) {
        this.g = f;
        this.caller = caller;
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()) {
            case R.id.button5:
                caller.startActivity(g);
                break;
        }
    }
}

Затем вызовите своего слушателя так:

intentPurple = findViewById(R.id.button5);
Intent gg = new Intent(MainActivity.this, PurpleActivty.class);
ButtonListener b = new ButtonListener(gg, MainActivity.this);
intentPurple.setOnClickListener(b);

спасибо, что сработало, порекомендуете ли вы сделать отдельный класс для activtyStart (); или я должен объявить это внутри моего метода oncreate класса mainActivity? я имею в виду, что я все еще могу сделать onClickListener внутри моего метода onCreate

Esla Baeny 20.05.2018 13:32

@EslaBaeny Не уверен, о чем вы спрашиваете. Вы можете открыть новый вопрос.

Tim Biegeleisen 20.05.2018 15:46

Другие вопросы по теме