Итак, я сделал три 3 файла java.
Я реализовал метод 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"
}}}
Есть ли способ решить эту проблему?




Я верю в
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);
context.startActivity (openThree) ... что вы имеете в виду под openThree?
говоря "вам не нужно использовать это", я не имел в виду, что вам не нужно использовать конструктор, но они сами задают ключевое слово this.
Вам нужно вызвать 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
@EslaBaeny Не уверен, о чем вы спрашиваете. Вы можете открыть новый вопрос.
public ButtonListener (Intent F) должен передать значение intent obj в конструктор общедоступного ButtonListener без него ButtonListener не получит значение intent obj для запуска Startactivity (obj)