【问题标题】:startActivity in java class crashjava类崩溃中的startActivity
【发布时间】:2018-10-07 11:11:49
【问题描述】:

我正在为一个学校项目开发一个 Android 应用程序,但我遇到了以下问题。我有一个MainActivity 和一个Button 和一个SecondActivity。当我单击MainActivity 中的按钮时,它必须打开SecondActivity。我在我的两台设备(三星 Galaxy s9+ 和华硕 zenfone2)上进行了测试:

MainActivity.java

public class MainActivity extends AppCompatActivity {
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button=(Button)findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent=new Intent(MainActivity.this,SecondActivity.class)
                startActivity(intent);
            }
        });
}
}

这在两个设备上都可以正常工作,当我点击按钮时,它会正确打开 SecondActivity。

问题是当我添加一个控制器类并尝试在其中启动 SecondActivity 时。这是控制器类:

Controller.java

public class Controller {
    public void open(Context cont){
        Intent intent=new Intent(cont,SecondActivity.class);
        cont.getApplicationContext().startActivity(intent);
     }
  }

我这样更改MainActivity

public class MainActivity extends AppCompatActivity {
    Button button;
    Controller c;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button=(Button)findViewById(R.id.button2);
        c=new Controller();

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                c.open(getApplicationContext());
            }
        });
}
}

这在我的 s9+ 上运行良好,而在我的 zenfone2 上,当我单击按钮时会崩溃。问题出在哪里?如果不正确,为什么适用于 s9+?

谢谢

【问题讨论】:

  • 公共类控制器 { public void open(MainActivity cont){ Intent intent=new Intent(cont,SecondActivity.class); cont.getApplicationContext().startActivity(intent); } } 试试这个

标签: java android start-activity


【解决方案1】:

从 Android P 开始,除非您添加 Intent.FLAG_ACTIVITY_NEW_TASK 标志,否则您无法使用应用程序上下文启动 Activity。因此,只需更改您的控制器和 mainactivity 以使用 mainactivity 上下文。

c.open(MainActivity.this);

public void open(Context context) {
    Intent intent = new Intent(context, SecondActivity.class);
    context.startActivity(intent);
}

或者

public void open(Context context) {
    Intent intent = new Intent(context.getApplicationContext(), SecondActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent);
}

【讨论】:

  • 哇,非常感谢!!!它有效(也没有标志)。我刚刚将 c.open(getApplicationContext()) 更改为 c.open(MainActivity.this)
【解决方案2】:

在 open 函数中从 Controller 类中删除 getApplicationContext()。 让它cont.startActivity(intent);

【讨论】:

  • 感谢您的回复。我刚刚尝试过,但它仍然在 zenfone2 上崩溃
【解决方案3】:

试试这个,

c.open(MainActivity.this);

并在 Controller 类中执行以下操作:

public void open(Context cont){
        Intent intent=new Intent(cont,SecondActivity.class);
        cont.startActivity(intent);
     }

【讨论】:

  • 感谢您的回复!!!它有效,但使用 MainActivity.this 而不是 MainActivity.class
【解决方案4】:

你不能再从getApplicationContext调用startActivity,你不需要调用这么多次。

getApplicationContext 替换为“this”。

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                c.open(MainActivity.class);
            }
        });

然后只需调用 startActivity

public class Controller {
    public void open(Context cont){
        Intent intent=new Intent(cont,SecondActivity.class);
        cont.startActivity(intent);
     }
  }

【讨论】:

  • 感谢您的回复。我尝试按照您的建议更改代码,但是在 MainActivity 中将 'getApplicationContext()' 更改为 'this' 我有以下错误:无法将控制器中的 open(android.content.Context) 应用于(匿名 android. view.View.OnClickListener)
  • 啊抱歉没有注意到它是匿名的。更正了它。您需要按名称调用外部类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多