Задать вопрос
@04FoxMulder

Attempt to invoke virtual method 'void android.widget.Button.setVisibility(int)' on a null object reference?

Есть такая проблема, как только добавляю в код эту строку
driverRegBtn.setVisibility(View.INVISIBLE); , приложение при переходе в этот активити крашется.
Кучу всего перелопатил, не могу понят почему, точнее почему так происходит я понимаю, но где я нетак сделал понять не могу.Помогите пожалуйста

Код активити:
package com.example.a9station;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class DriverRegLoginActivity extends AppCompatActivity {
    Button signInBtn, driverRegBtn;
    TextView statusDriver, quest;
    EditText driverEmail, driverPassword;


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

        driverRegBtn = findViewById(R.id.driverReg);
        quest = findViewById(R.id.quest);
        driverEmail = findViewById(R.id.driverEmail);
        driverPassword = findViewById(R.id.driverPassword);
        signInBtn = findViewById(R.id.signIn);
        statusDriver = findViewById(R.id.statusDriver);

        driverRegBtn.setVisibility(View.INVISIBLE);


        //driverRegBtn.setEnabled(false);

       /* quest.setOnClickListener(v ->
        {
           driverRegBtn.setVisibility(View.VISIBLE);
            driverRegBtn.setEnabled(true);

            signInBtn.setVisibility(View.INVISIBLE);
            signInBtn.setEnabled(false);

            quest.setVisibility(View.INVISIBLE);

            statusDriver.setText("Регистрация_для_водителя");
        });*/

        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_driver_reg_login);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

    }
}


xml Активити:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg1"
    tools:context=".DriverRegLoginActivity">

    <EditText
        android:id="@+id/driverEmail"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:ems="10"
        android:textColor="@android:color/white"
        android:hint="@string/example_mail_com"
        android:layout_marginTop="10dp"
        android:textColorHint="@android:color/white"
        android:autofillHints="emailAddress"
        android:layout_below="@id/statusDriver"
        android:inputType="textEmailAddress" />

    <EditText
        android:id="@+id/driverPassword"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:ems="10"
        android:hint="@string/password"
        android:textColorHint="@android:color/white"
        android:layout_below="@id/driverEmail"
        android:layout_marginTop="10dp"
        android:autofillHints="password"
        android:inputType="textPassword" />

    <Button
        android:id="@+id/signIn"
        android:layout_width="220dp"
        android:layout_height="wrap_content"
        android:layout_below="@id/driverPassword"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:background="@android:color/black"
        android:textSize="25sp"
        android:text="@string/enter" />

    <Button
        android:id="@+id/driverReg"
        android:layout_width="220dp"
        android:layout_height="wrap_content"
        android:layout_below="@id/signIn"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:background="@android:color/black"
        android:textSize="25sp"
        android:text="@string/Registration"/>

    <TextView
        android:id="@+id/statusDriver"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="200dp"
        android:textColor="@android:color/white"
        android:textSize="25sp"
        android:textStyle="bold"
        android:visibility="invisible"
        android:text="@string/signinForDriver" />

    <TextView
        android:id="@+id/quest"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/driverReg"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dp"
        android:textSize="20sp"
        android:textColor="@android:color/white"
        android:text="@string/INotHaveAccount" />
</RelativeLayout>


Логинкат:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.a9station/com.example.a9station.DriverRegLoginActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setVisibility(int)' on a null object reference
  • Вопрос задан
  • 28 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@evgez
Ошибка возникает из-за того, что вы пытаетесь получить доступ к элементам интерфейса через findViewById() до установки макета активности с помощью setContentView(). В результате переменные driverRegBtn, quest и другие остаются null, и попытка вызвать методы на этих объектах приводит к крашу.

Исправьте порядок вызовов в onCreate():
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 1. Сначала устанавливаем макет
    setContentView(R.layout.activity_driver_reg_login);
    
    // 2. Теперь инициализируем элементы интерфейса
    driverRegBtn = findViewById(R.id.driverReg);
    quest = findViewById(R.id.quest);
    driverEmail = findViewById(R.id.driverEmail);
    driverPassword = findViewById(R.id.driverPassword);
    signInBtn = findViewById(R.id.signIn);
    statusDriver = findViewById(R.id.statusDriver);
    
    // 3. Теперь можем работать с элементами
    driverRegBtn.setVisibility(View.INVISIBLE);
    
    // Остальной код (EdgeToEdge и т.д.)
    EdgeToEdge.enable(this);
    ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
        Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
        v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
        return insets;
    });
}


Убедитесь, что в вашем XML есть все указанные элементы с правильными android:id.

Для элементов, которые могут быть скрыты/показаны, проверьте начальное состояние видимости в XML (например, android:visibility).

Используйте аннотацию @Nullable или @NonNull для переменных представлений, чтобы получить подсказки от Android Studio.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы