lil*_*lin 3 java android firebase navigation-drawer firebase-authentication
我想在我的项目中实现退出方法。我观看了所有 youtube 教程,但似乎导航抽屉是更新版本。我对如何将这些注销编码实施到我的编码中一无所知。
最新版本的导航抽屉已经内置在 ui 包文件夹中。所以我不太确定如何实现这些教程代码,因为大多数教程代码都有这个代码。下面是教程代码,我不知道如何将注销方法实现到我的 home.java 代码中。谢谢你
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_home) {
getSupportActionBar().setTitle("Home");
getSupportFragmentManager().beginTransaction().replace(R.id.container,new HomeFragment()).commit();
} else if (id == R.id.nav_profile) {
getSupportActionBar().setTitle("Profile");
getSupportFragmentManager().beginTransaction().replace(R.id.container,new ProfileFragment()).commit();
} else if (id == R.id.nav_settings) {
getSupportActionBar().setTitle("Settings");
getSupportFragmentManager().beginTransaction().replace(R.id.container,new SettingsFragment()).commit();
}
else if (id == R.id.nav_signout) {
FirebaseAuth.getInstance().signOut();
Intent loginActivity = new Intent(getApplicationContext(),LoginActivity.class);
startActivity(loginActivity);
finish();
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
Run Code Online (Sandbox Code Playgroud)
这是我的 home.java 代码
package com.example.guru;
import android.os.Bundle;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import android.view.View;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import com.google.android.material.navigation.NavigationView;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.view.Menu;
import android.widget.TextView;
public class Home extends AppCompatActivity {
FirebaseAuth firebaseAuth;
FirebaseUser currentUser;
DatabaseReference databaseReference;
private AppBarConfiguration mAppBarConfiguration;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//ini
firebaseAuth = FirebaseAuth.getInstance();
currentUser = firebaseAuth.getCurrentUser();
databaseReference = FirebaseDatabase.getInstance().getReference("Customer");
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
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_profile, R.id.nav_orders,R.id.nav_logout)
.setDrawerLayout(drawer)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
updateNavHeader();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.home, menu);
return true;
}
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|| super.onSupportNavigateUp();
}
public void updateNavHeader() {
NavigationView navigationView = findViewById(R.id.nav_view);
View headerView= navigationView.getHeaderView(0);
TextView navName= headerView.findViewById(R.id.txtName);
TextView navEmail=headerView.findViewById(R.id.txtEmail);
navName.setText(currentUser.getDisplayName());
navEmail.setText(currentUser.getEmail());
}
}
Run Code Online (Sandbox Code Playgroud)
登出片段
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import com.example.guru.R;
public class LogoutFragment extends Fragment {
private LogoutViewModel logoutViewModel;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
logoutViewModel =
ViewModelProviders.of(this).get(LogoutViewModel.class);
View root = inflater.inflate(R.layout.fragment_logout, container, false);
final TextView textView = root.findViewById(R.id.text_logout);
logoutViewModel.getText().observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
textView.setText(s);
}
});
return root;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的 LogoutViewModel
package com.example.guru.ui.Logout;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class LogoutViewModel extends ViewModel {
private MutableLiveData<String> mText;
public LogoutViewModel() {
mText = new MutableLiveData<>();
mText.setValue("logout");
}
public LiveData<String> getText() {
return mText;
}
}
Run Code Online (Sandbox Code Playgroud)
Vik*_*son 25
感觉应该有一个内置的解决方案,但到目前为止我已经解决了这个问题。我只是在该菜单选项上添加了一个点击监听器,在我的例子中是我的注销按钮:
在 Java 中 -->
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.getMenu().findItem(R.id.logout).setOnMenuItemClickListener(menuItem -> {
logout();
return true;
});
Run Code Online (Sandbox Code Playgroud)
在科特林-->
navView.getMenu().findItem(R.id.nav_logout).setOnMenuItemClickListener({ menuItem ->
logoutDialog()
true
})
Run Code Online (Sandbox Code Playgroud)
小智 0
我的导航菜单代码
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:showIn="navigation_view">
<item
android:id="@+id/nav_share"
android:icon="@drawable/ic_menu_share"
android:title="@string/menu_share" />
<item
android:id="@+id/logout"
android:icon="@drawable/logout"
android:title="Logout" />
<item
android:id="@+id/login"
android:icon="@drawable/logout"
android:title="Login" />
</menu>
Run Code Online (Sandbox Code Playgroud)
onResume 方法内的代码,这将根据用户的身份验证状态隐藏注销或登录按钮
@Override
protected void onResume() {
super.onResume();
if (auth.getCurrentUser() == null) {
navigationView.getMenu().findItem(R.id.logout).setVisible(false);
navigationView.getMenu().findItem(R.id.login).setVisible(true);
// perform action when user is not logged in
} else {
navigationView.getMenu().findItem(R.id.logout).setVisible(true);
navigationView.getMenu().findItem(R.id.login).setVisible(false);
// perform action when user is already logged in
}
}
Run Code Online (Sandbox Code Playgroud)
处理导航视图项目点击此处。
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.logout) {
auth.signOut();
onResume();
} else if (id == R.id.login) {
//handle event login button pressed
startActivity(new Intent(MainActivity.this, LoginActivity.class));
}
DrawerLayout drawer = findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
Run Code Online (Sandbox Code Playgroud)
希望对你有帮助
| 归档时间: |
|
| 查看次数: |
7559 次 |
| 最近记录: |