0

Я создал и настроил шаблон Navigation Drawer Activity. В одном из фрагментов есть кнопка Button, при нажатии на которую должна открываться новая активити BDActivity. Я написал следующий код в MainActivity:

public class MainActivity extends AppCompatActivity {

private AppBarConfiguration mAppBarConfiguration;
private Button btn;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Window w = getWindow();
    w.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    DrawerLayout drawer = findViewById(R.id.drawer_layout);
    NavigationView navigationView = findViewById(R.id.nav_view);
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    mAppBarConfiguration = new AppBarConfiguration.Builder(
            R.id.nav_home, R.id.nav_help, R.id.nav_play,
            R.id.nav_tools, R.id.nav_about, R.id.nav_profile)
            .setDrawerLayout(drawer)
            .build();
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
    NavigationUI.setupWithNavController(navigationView, navController);
    OnBtnClick();
}

public void OnBtnClick(){
    this.btn = findViewById(R.id.button);

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v){
            Intent intent = new Intent("ru.example.blippy.BDActivity");
            startActivity(intent);
        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onSupportNavigateUp() {
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    return NavigationUI.navigateUp(navController, mAppBarConfiguration)
            || super.onSupportNavigateUp();
}  

}

При этом приложение не запускается, однако, как только я убираю строку OnBtnClick(); из onCreate, приложение запускается, но кнопка, естественно, не работает. Подскажите, пожалуйста, как поступить?

E/AndroidRuntime: FATAL EXCEPTION: main
Process: ru.example.blippy, PID: 22252
java.lang.RuntimeException: Unable to start activity ComponentInfo{ru.example.blippy/ru.example.blippy.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
    at ru.example.blippy.MainActivity.OnBtnClick(MainActivity.java:57)
    at ru.example.blippy.MainActivity.onCreate(MainActivity.java:51)
    at android.app.Activity.performCreate(Activity.java:6975)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)  

51 и 57 это OnBtnClick(); и btn.setOnClickListener(new View.OnClickListener() { соответственно.

Вот моя кнопка:

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button"
    app:layout_constraintBottom_toBottomOf="@+id/imageView3"
    app:layout_constraintEnd_toEndOf="@+id/imageView3"
    app:layout_constraintHorizontal_bias="0.434"
    app:layout_constraintStart_toStartOf="@+id/imageView3"
    app:layout_constraintTop_toTopOf="@+id/imageView3"
    app:layout_constraintVertical_bias="0.886" />

id проверял, менял на новый и опять вернулся к старому. Результат все тот же.
Кнопка не в выдвижном меню. Она во фрагменте.

  • У вас явно какая-то ошибка. Но без логов падения сложно сказать в чём проблема. Приложите логи падения в вопрос + укажите строку падения. Скорее всего у вас неправильный ID в разметке/коде или кнопки просто нет. – ЮрийСПб Nov 24 '19 at 21:03
  • @ЮрийСПб , приложил – Алекс Петров Nov 24 '19 at 21:26
  • Нужно научиться читать и анализировать логи. – Эникейщик Nov 24 '19 at 21:34
  • У вас проблема в том, что тут: this.btn = findViewById(R.id.button); this.btn null. У вас либо ID в разметке не тот или не там или кнопки вообще нет или она в выдвижном меню. Если последнее - надо не так искать. Если последнее - покажите заметку. – ЮрийСПб Nov 24 '19 at 21:35
  • @ЮрийСПб , посмотрите, пожалуйста, я дополнил вопрос – Алекс Петров Nov 24 '19 at 21:54
  • @Эникейщик , учусь, стараюсь) Я смотрел на строки 51 и 57, но так и не нашел ошибки. Вроде все указал верно. Посмотрите, пожалуйста, может я что то важное упустил? – Алекс Петров Nov 24 '19 at 22:14

1 Answers1

0

Ошибка у вас в том, что разметка активити и фрагмента - это разные разметки. Нельзя прямо (можно, но сложно и это неправильно) получить ссылку на кнопку во фрагменте из активити.

Вам надо искать вашу кнопку во фрагменте (например в onViewCreated() методе) и там же назначать слушатель нажатий. Если при этом надо метод из активити вызвать - надо кастовать активити фрагмента к интерфейсу, который активити реализует. Или кастовать к классу активити.