我对 Android Studio 和 Java 都很陌生。当用户单击“注销”时,我当前开发的应用程序崩溃了。我已经多次编辑我的代码。我现在不知道。我希望能得到编程天才的帮助。
这是我的抽屉菜单代码:
package com.example.sample_app;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.navigation.NavigationView;
import com.google.firebase.FirebaseApp;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
private DrawerLayout drawer;
private FirebaseUser user;
private DatabaseReference reference;
private String userID;
private TextView EmailTxtView, UIDTxtView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sliding_nav);
// Initialize Firebase
FirebaseApp.initializeApp(this);
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar,
R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
// Get the header view from the NavigationView
View headerView = navigationView.getHeaderView(0);
//Initialised the parameter for Firebase
user = FirebaseAuth.getInstance().getCurrentUser();
reference = FirebaseDatabase.getInstance().getReference("Users");
userID = user.getUid();
// Find the TextViews by their IDs
EmailTxtView = headerView.findViewById(R.id.email_username);
UIDTxtView = headerView.findViewById (R.id.uid);
reference.child(userID).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
User userProfile = snapshot.getValue(User.class);
if (userProfile != null) {
String email = userProfile.email;
String UID = userProfile.username;
EmailTxtView.setText(email);
UIDTxtView.setText(UID);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(MainActivity.this, "Error", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onBackPressed() {
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int itemId = item.getItemId();
if (itemId == R.id.tracking) {
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new FragmentTracking()).commit();
} else if (itemId == R.id.profile) {
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new FragmentProfile()).commit();
} else if (itemId == R.id.settings) {
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new FragmentSetting()).commit();
} else if (itemId == R.id.logout) {
Intent intent = new Intent(MainActivity.this,LoginUser.class);
// intent.putExtra("LOGOUT", true);
startActivity(intent);
finish();
}
drawer.closeDrawer(GravityCompat.START);
return true;
}
}
这是错误消息。
E FATAL EXCEPTION: main
Process: com.example.sample_app, PID: 18145
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sample_app/com.example.sample_app.LoginUser}: com.google.firebase.database.DatabaseException: Calls to setPersistenceEnabled() must be made before any other usage of FirebaseDatabase instance.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: com.google.firebase.database.DatabaseException: Calls to setPersistenceEnabled() must be made before any other usage of FirebaseDatabase instance.
at com.google.firebase.database.FirebaseDatabase.assertUnfrozen(FirebaseDatabase.java:332)
at com.google.firebase.database.FirebaseDatabase.setPersistenceEnabled(FirebaseDatabase.java:285)
at com.example.sample_app.LoginUser.onCreate(LoginUser.java:37)
at android.app.Activity.performCreate(Activity.java:7009)
at android.app.Activity.performCreate(Activity.java:7000)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
只有当用户开始按下注销然后应用程序崩溃时,其他选择的片段才能正常工作
我也尝试过“startActivity(new Intent())”方法,但还是一样。
谢谢你,非常感谢你的努力。如果您想了解有关错误的更多详细信息,请告诉我
我试过这个:
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
// Enable Firebase database persistence
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
}
//I have set this in my login screen
这是因为错误消息确实提到了 setPersistenceEnabled() 我应该删除那个或任何其他措施吗?