从 Android 上的 Class 启动 Activity 时出错

Error starting Activity from a Class on Android

我有以下 class SubMenuToolBar ,我通常从构造函数中传递自身 (this) 的 activity (MainActivity) 实例化实例化时:

public class SubMenuToolBar extends Activity {
        private android.support.v7.widget.Toolbar mToolbar;
        private Activity mActivity;
        RelativeLayout mLayout;

public SubToolbar(android.support.v7.widget.Toolbar toolbar, Activity activity) {
            mActivity = activity;
            mToolbar = toolbar;
            mLayout = (RelativeLayout) mToolbar.findViewById(R.id.layout_toolbar);

            mLayout.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    Intent intent = new Intent(mActivity, UserMessagesActivity.class);
                    startActivity(intent);
                }
            });

    }

MainActivity.cs

protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
    new SubMenuToolBar ((android.support.v7.widget.Toolbar) findViewById(R.id.sub_toolbar), this);
    }

每次我点击用点击事件处理程序注册的元素(在 activity 中)我都会得到一个常见的错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference

11-20 08:31:33.422 23802-23802/com.xxx.apps.xxx E/AndroidRuntime:     at android.app.Activity.startActivityForResult(Activity.java:3918)
11-20 08:31:33.422 23802-23802/com.xxx .apps.xxx E/AndroidRuntime:     at android.app.Activity.startActivityForResult(Activity.java:3877)
11-20 08:31:33.422 23802-23802/com.xxx.apps.xxx E/AndroidRuntime:     at android.app.Activity.startActivity(Activity.java:4200)
11-20 08:31:33.422 23802-23802/com.xxx.apps.xxx  E/AndroidRuntime:     at android.app.Activity.startActivity(Activity.java:4168)
11-20 08:31:33.422 23802-23802/com.xxx.apps.xxx E/AndroidRuntime:     at com.xxx.apps.xxx.SubMenuToolBar.onClick(SubToolbar.java:28)

我试过在 Intent 中使用 Activity,activity 中的 Context,getApplicationContext 和 getBaseContext。全部在线抛出相同的错误:

 Intent intent = new Intent(mActivity, MessagesActivity.class);

我已经检查过 SO 和各种 Web 资源,其中大多数指向 activity 需要传递给 class 所以它的上下文用于 Intent,我已经这样做了你可以在上面看到并确保调用 Activity 的所有细节都已传递并使用,问题仍然存在。

知道我做错了什么吗?

尝试替换这个:

Intent intent = new Intent(mActivity, UserMessagesActivity.class);
startActivity(intent);

对此:

Intent intent = new Intent(mActivity, UserMessagesActivity.class);
mActivity.startActivity(intent);

你有点糊涂了。 Activity 不能用 new 实例化。您必须使用 Intent 启动它。有两项活动,但我认为您只需要一项。

public class SubMenuToolBar extends Activity {

    RelativeLayout mLayout;

    @Override
    protected void onCreate(Bundle savedInstance) {
        super.onCreate(savedInstance);
        setContentView(R.layout.your_activity_layout);

        android.support.v7.widget.Toolbar mToolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.sub_toolbar);

        mLayout = (RelativeLayout)mToolbar.findViewById(R.id.layout_toolbar);

        mLayout.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            Intent intent = new Intent(mActivity, UserMessagesActivity.class);
            startActivity(intent);
        });
}

并使用 SubMenuToolBar 作为您的主要 activity。