Я пытаюсь добавить прослушиватель кликов, и когда я добавляю строку 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>
Вы определяете jobs_button
в макете xml домашнего фрагмента и получаете доступ к кнопке в действии. Почему ? Вы не можете получить findviewbyId представления фрагмента в действии. Он вернется null
.
Это просто потому, что вы пытаетесь связать кнопку внутри действия с помощью:
setContentView(R.layout.activity_main);
...
Button button1 = findViewById(R.id.jobs_button);
но кнопка не находится внутри макета activity_main
. Это внутри макета вашего домашнего фрагмента.
Это устранило проблему. Но теперь кнопка появляется на каждом фрагменте, но я хочу, чтобы она была только на домашнем фрагменте.
Похоже, вы используете один и тот же макет для всех макетов фрагментов. Используйте определенный макет для каждого из них.
Хорошо, спасибо. Я новичок в этом, как мне это сделать?
Вам понадобится каждый макет для фрагментов, например: исходный фрагмент, избранный фрагмент и макет фрагмента_поиска.
IM извините, я не понимаю, не могли бы вы показать простой пример кода. если бы я сделал это, как мне переключаться между макетами в основной активности
Пожалуйста, поделитесь своим отчетом о сбое, а также поделитесь кодом xml.