Android Studio App stürzt ab nach klick auf Button?
Hallo,
ich habe eine Android Studio Applikation mit einer Bottom Navigation bar, bei welcher unter dem Reiter "Profile" ein User hinzugefügt werden soll. Wenn ich dort auf "Add User" klick stürzt die App allerdings ab, in der Version ohne Navigationsbar funktioniert das allerdings einwand frei. Vielleicht kann mir jedmand helfen, den Fehler zu finden.
Hier ist die UI von Profile:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout ...
...
<Button
android:id="@+id/btAddUser"
...
android:text="Add User"
android:onClick="onAddUser"
/>
</LinearLayout>
Hier die UI der BottomBar:
<?xml version="1.0" encoding="utf-8"?>
<...
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/fragment_container"
>
...
app:menu="@menu/bottom_navigation"/>
</FrameLayout>
Die Klasse zur BottomBar:
package com.example.bottomnav;
import ...
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView bottomNavigation = findViewById(R.id.bottom_navigation); bottomNavigation.setOnNavigationItemSelectedListener(navListener);
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
...
private BottomNavigationView.OnNavigationItemSelectedListener navListener =
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull @NotNull MenuItem item) {
Fragment selectedFragment = null;
switch (item.getItemId())
{
case R.id.nav_projects:
selectedFragment = new ...
ProfileFragment();
break;
}
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
selectedFragment).commit();
return true;
}};}
Hier der Code zum Profil hinzufügen:
@Nullable
@org.jetbrains.annotations.Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_profile, container, false);
}
public
class MyActivity extends AppCompatActivity {
...
Button btAddUser;
...
Boolean isAdmin = Boolean.FALSE;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_profile);
...
btAddUser = findViewById(R.id.btAddUser);
btAddUser.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {onAddUser(btAddUser);}
public void onAddUser(View view) {
...
2 Antworten
1) Du solltest schauen, dass du an einen Error Stacktrace gelangst. Sei es via Debugging oder ein Logging.
2) Was mir bisher nur auffällt, ist die Tatsache, dass du in Kauf nimmst, der replace-Methode im BottomNavigationView.OnNavigationItemSelectedListener auch einen null-Wert zu übergeben. Ich könnte mir vorstellen, dass das im schlechtesten Fall auch einmal für einen Fehler sorgen könnte.
Dein View:
android:onClick="onAddUser"
sucht nach einer Methode onAddUser, die es aber nicht finden kann, da diese versteckt in einer anonymen Klasse (OnClickListener) steckt.
Die Methode onAddUser muss eine Methode deiner MyActivity-Klasse sein.
Diese Zeilen:
btAddUser = findViewById(R.id.btAddUser);
btAddUser.setOnClickListener(new View.OnClickListener() {
// ...
}
brauchst du gar nicht, da du die Verknüpfung zwischen Handler und Button bereits über dein XML-Layout herstellst.
Es gibt doch sicher Logfiles mit Fehlermeldungen?
OK danke, ich kriege halt die Meldung:
java.lang.IllegalStateException: Could not find method onAddUser(View) in a parent or ancestor Context for android:onClick attribute defined on view class com.google.android.material.button.MaterialButton with id 'btAddUser'