如何在单独Java类的OnClick()方法中实现startActivity()?

如何在单独Java类的OnClick()方法中实现startActivity()?,java,android,android-intent,onclicklistener,Java,Android,Android Intent,Onclicklistener,所以我制作了3个java文件 主要活动课 java(单独的java类) 目的性活动类(活动) 我在ButtonListener.java文件中实现了OnclickListener和OnClick方法 我想在ButtonListener文件的onClick(视图v)中启动intent startActivity()。但它在startActivity()行上抛出了错误 我知道我可以在AvtivityClass的onCreate下创建OnClick方法,但我不想这样做,因为我已经创建了一个单独的jav

所以我制作了3个java文件

  • 主要活动课
  • java(单独的java类)
  • 目的性活动类(活动)
  • 我在ButtonListener.java文件中实现了OnclickListener和OnClick方法

    我想在ButtonListener文件的onClick(视图v)中启动intent startActivity()。但它在startActivity()行上抛出了错误

    我知道我可以在AvtivityClass的onCreate下创建OnClick方法,但我不想这样做,因为我已经创建了一个单独的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);
    
        }
    
    }
    
    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"
                }}}
    
    文件按钮Listener.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);
    
        }
    
    }
    
    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。这会导致问题,因为您在不同的类中,您也应该将MainActivity的上下文作为参数传递,并使用

     context.startActivity(g);
    


    您需要从活动的上下文调用
    startActivity
    ,而不是从自定义处理程序类调用。将
    按钮列表器重构为:

    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);
    

    public ButtonListener(Intent F)将Intent obj值传递到public ButtonListener的构造函数中,而不传递该值ButtonListener将无法获取Intent obj值以启动Startactivity(obj)上下文。Startactivity(openThree)。。。你所说的openThree是什么意思?我说的“你不必使用它”并不是说你不必使用构造函数,而是说它本身就是一个关键字。谢谢你的帮助,你会建议为ActivityStart()创建一个单独的类吗;或者我应该在mainActivity类的oncreate方法中声明它吗?我的意思是我仍然可以在onCreate中创建onClickListenermethod@EslaBaeny不知道你在问什么。你可能想提出一个新问题。