0

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View androidx.constraintlayout.widget.ConstraintLayout.findViewById(int)' on a null object reference

It says that this line causes it:

LinearLayout all_sets = main.findViewById(R.id.all_sets);

The Java code (MainActivity.java):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    @SuppressLint("ResourceType") ConstraintLayout main = findViewById(R.layout.activity_main);

    LinearLayout all_sets = main.findViewById(R.id.all_sets); //causes the error when the code is as-is

    LinearLayout set1 = all_sets.findViewById(R.id.set1); //causes the error without the '@Suppress..._main);' and the 'main.' in '...all_sets = main.find...'
    LinearLayout set2 = all_sets.findViewById(R.id.set2);
    LinearLayout set3 = all_sets.findViewById(R.id.set3);

    ImageView triangle1 = set1.findViewById(R.id.triangle1);
    ImageView triangle2 = set1.findViewById(R.id.triangle2);
    ImageView cloud = set2.findViewById(R.id.cloud);
    ImageView hexagon = set2.findViewById(R.id.hexagon);

    triangle1.setVisibility(View.INVISIBLE);
    triangle2.setVisibility(View.INVISIBLE);
    cloud.setVisibility(View.INVISIBLE);
    hexagon.setVisibility(View.INVISIBLE);

    setContentView(R.layout.activity_main);

The XML (activity_main.xml):

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:id="@+id/all_sets"
        android:layout_width="409dp"
        android:layout_height="729dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <LinearLayout
            android:id="@+id/set1"
            android:layout_width="match_parent"
            android:layout_height="243dp"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/triangle1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                app:srcCompat="@drawable/triangle1" />

            <ImageView
                android:id="@+id/triangle2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                app:srcCompat="@drawable/triangle2" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/set2"
            android:layout_width="match_parent"
            android:layout_height="243dp"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/cloud"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                app:srcCompat="@drawable/cloud" />

            <ImageView
                android:id="@+id/hexagon"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                app:srcCompat="@drawable/hexagon" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/set3"
            android:layout_width="match_parent"
            android:layout_height="243dp"
            android:orientation="horizontal"></LinearLayout>
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

I also tried without specifying which View to find in:

LinearLayout all_sets = findViewById(R.id.all_sets);
LinearLayout set1 = all_sets.findViewById(R.id.set1); //causes the error in this case
LinearLayout set2 = all_sets.findViewById(R.id.set2);
LinearLayout set3 = all_sets.findViewById(R.id.set3);

I don't see any "it's because view1 is not directly in view2 but in view3 which is in view2".

What is the problem? Why does this give an NPE (Null Pointer Exception)?

I want to show the layout only after making the ImageViews invisible programmatically.

0 Answers0