无法从我的活动方法访问视图? (null对象引用)

时间:2016-09-25 18:07:11

标签: java android android-studio

我有一个名为 TouchImageView 的类,它扩展了 ImageView ,它基本上实现了类似于Android的“照片”中的图像查看器。

当用户单击 TouchImageView 时,我希望“activity_viewimage”中的其他两个视图通过调用主活动 ViewImageActivity 中的方法来更改可见性:

@Override
    public boolean onSingleTapConfirmed(MotionEvent e)
    {
        ViewImageActivity viewImageActivity= new ViewImageActivity();
        viewImageActivity.toggleTopBottomViews();
    }

现在在 ViewImageActivity

public class ViewImageActivity extends AppCompatActivity {

private View bottomView;
private View topView;

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

    bottomView = findViewById(R.id.bottom_view);
    topView = findViewById(R.id.top_view);
}

public void toggleTopBottomViews ()
{
    if (topView.getVisibility()== View.VISIBLE && bottomView.getVisibility()== View.VISIBLE)
    {
        bottomView.setVisibility(View.INVISIBLE);
        topView.setVisibility(View.INVISIBLE);
    }
    else
    {
        bottomView.setVisibility(View.VISIBLE);
        topView.setVisibility(View.VISIBLE);
    }
}

错误堆栈:

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getVisibility()' on a null object reference
                                                                                  at com.example.zigo.photoencryption.ViewImageActivity.toggleTopBottomViews(ViewImageActivity.java:273)
                                                                                  at com.example.zigo.photoencryption.TouchImageView$GestureListener.onSingleTapConfirmed(TouchImageView.java:764)
                                                                                  at android.view.GestureDetector$GestureHandler.handleMessage(GestureDetector.java:300)
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                  at android.os.Looper.loop(Looper.java:148)
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

1 个答案:

答案 0 :(得分:1)

你永远不会通过new创建一个Activity。它将无法正确初始化,活动的初始化仅由框架处理,以响应启动Activity的请求。即使您可以通过new创建一个Activity也无济于事,您将创建一个具有不同视图的新Activity。 (在这里你得到了NPE,因为onCreate根本没有被调用,而不是被框架调用,因为它没有正确启动,而不是你。)

相反,你应该做的是传递你想要切换到你的探测器的视图,以便它可以直接进行,或者让创建手势探测器的活动在回调中传递并自行完成。

这里有一个机会,你真的不明白什么是活动 - 如果你认为你可以通过创建一个Activity随时添加视图,那么你需要回到关于活动是什么的教程。