Как исправить ошибку сбоя с помощью OnClickListener()?

Я пытаюсь добавить прослушиватель кликов, и когда я добавляю строку button1.setOnClickListener(this); мое приложение больше не будет работать

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

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

    BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation);
    bottomNav.setOnNavigationItemSelectedListener(navListener);

    Button button1 = findViewById(R.id.jobs_button);
    button1.setOnClickListener(this);

    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
            new HomeFragment()).commit();
}

private BottomNavigationView.OnNavigationItemSelectedListener navListener =
        new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                Fragment selectedFragment = null;

                switch (item.getItemId())
                {
                    case R.id.navHome:
                        selectedFragment = new HomeFragment();
                        break;
                    case R.id.navFavourites:
                        selectedFragment = new FavouritesFragment();
                        break;
                    case R.id.navSearch:
                        selectedFragment = new SearchFragment();
                        break;
                }
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        selectedFragment).commit();
                return true;
            }
        };
@Override
public void onClick(View v) {
    switch(v.getId())
    {
        case R.id.jobs_button:
            Toast.makeText(this, "button clicked",Toast.LENGTH_SHORT).show();
            break;
        default:
            break;
    }
  }
}

Это мой отчет о сбое

2019-04-09 12:23:54.390 9106-9106/com.example.jobsthatcare E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.jobsthatcare, PID: 9106
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.jobsthatcare/com.example.jobsthatcare.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:2913)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     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 com.example.jobsthatcare.MainActivity.onCreate(MainActivity.java:24)
        at android.app.Activity.performCreate(Activity.java:7136)
        at android.app.Activity.performCreate(Activity.java:7127)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)

Вот мой XML для домашнего фрагмента

<?xml version = "1.0" encoding = "utf-8"?>
<RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:background = "@android:color/background_light">

    <TextView
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:text = "Home Fragment"
        android:textSize = "30sp"
        android:layout_centerInParent = "true"
        />

    <Button
        android:id = "@+id/jobs_button"
        android:layout_width = "200sp"
        android:layout_height = "wrap_content"
        android:layout_alignParentTop = "true"
        android:layout_centerHorizontal = "true"
        android:layout_marginTop = "200sp"
        android:text = "Jobs"
        android:background = "@android:color/holo_orange_dark"/>

и вот 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:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:background = "@color/colorPrimary"
    tools:context = ".MainActivity">

    <FrameLayout
        android:id = "@+id/fragment_container"
        android:layout_width = "match_parent"
        android:layout_height = "match_parent"
        android:layout_above = "@+id/bottom_navigation"
        />

    <android.support.design.widget.BottomNavigationView
        android:id = "@+id/bottom_navigation"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:layout_alignParentBottom = "true"
        app:menu = "@menu/bottom_navigation"
        android:background = "@color/colorAccent"
    />

</RelativeLayout>

Пожалуйста, поделитесь своим отчетом о сбое, а также поделитесь кодом xml.

Taufik Android 09.04.2019 13:15

Вы определяете jobs_button в макете xml домашнего фрагмента и получаете доступ к кнопке в действии. Почему ? Вы не можете получить findviewbyId представления фрагмента в действии. Он вернется null.

Jitesh Prajapati 09.04.2019 13:46
1
2
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это просто потому, что вы пытаетесь связать кнопку внутри действия с помощью:

setContentView(R.layout.activity_main);

...
Button button1 = findViewById(R.id.jobs_button);

но кнопка не находится внутри макета activity_main. Это внутри макета вашего домашнего фрагмента.

Это устранило проблему. Но теперь кнопка появляется на каждом фрагменте, но я хочу, чтобы она была только на домашнем фрагменте.

AlexOToole 09.04.2019 13:58

Похоже, вы используете один и тот же макет для всех макетов фрагментов. Используйте определенный макет для каждого из них.

ישו אוהב אותך 09.04.2019 14:01

Хорошо, спасибо. Я новичок в этом, как мне это сделать?

AlexOToole 09.04.2019 14:03

Вам понадобится каждый макет для фрагментов, например: исходный фрагмент, избранный фрагмент и макет фрагмента_поиска.

ישו אוהב אותך 10.04.2019 04:48

IM извините, я не понимаю, не могли бы вы показать простой пример кода. если бы я сделал это, как мне переключаться между макетами в основной активности

AlexOToole 10.04.2019 12:15

Другие вопросы по теме