Android 导航抽屉,处理返回按钮转到以前的片段?
我正在使用内置导航抽屉运行我的应用程序。我不太明白如何操作后退按钮。当它被按下时,我希望它再次加载第一个片段。碎片1 因此,当应用程序启动时,您会看到Fragment1启动。然后他们可以点击片段2-5转到其他页面。在所有这些页面中,我希望返回按钮将用户带回Fragment1。用户应该能够通过后退按钮退出应用程序的唯一位置是Fragment1 因为这一切都是由一个零碎的活动处理的,所以我试着弄乱了那里的“后退”按钮。我不断收到一个强制关闭错误,但是:Android 导航抽屉,处理返回按钮转到以前的片段?,android,android-fragments,android-fragmentactivity,navigation-drawer,Android,Android Fragments,Android Fragmentactivity,Navigation Drawer,我正在使用内置导航抽屉运行我的应用程序。我不太明白如何操作后退按钮。当它被按下时,我希望它再次加载第一个片段。碎片1 因此,当应用程序启动时,您会看到Fragment1启动。然后他们可以点击片段2-5转到其他页面。在所有这些页面中,我希望返回按钮将用户带回Fragment1。用户应该能够通过后退按钮退出应用程序的唯一位置是Fragment1 因为这一切都是由一个零碎的活动处理的,所以我试着弄乱了那里的“后退”按钮。我不断收到一个强制关闭错误,但是: (01-11 14:09:33.114: E/
(01-11 14:09:33.114: E/AndroidRuntime(8292): android.view.InflateException: Binary XML file line #7: Error inflating class fragment)
这就是我到目前为止所做的:
我已确保将片段添加到后堆栈中,如下所示:
fm.beginTransaction().replace(R.id.main, newFragment).addToBackStack("fragBack").commit();
后退按钮:
@Override
public void onBackPressed() {
if (getSupportFragmentManager().findFragmentByTag("fragBack") != null) {
}
else {
super.onBackPressed();
return;
}
if (getSupportFragmentManager().getBackStackEntryCount() != 0) {
Toast.makeText(getApplicationContext(), "Test", Toast.LENGTH_LONG).show();
Fragment frag = getSupportFragmentManager().findFragmentByTag("fragBack");
FragmentTransaction transac = getSupportFragmentManager().beginTransaction().remove(frag);
transac.commit();
}
}
有人知道我需要做什么吗?我是否需要在每个片段中调用onBackPressed(如果可能的话),而不是控制抽屉的FragmentActivity?在我过去的应用程序中,无论用户在哪个片段上,我都可以用后退按钮关闭应用程序,但我现在要做的是,我希望后退按钮返回到Fragment1
非常感谢您的帮助,谢谢
麦克里克
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Fragment newFragment = new MapsPage();
FragmentManager fm = getSupportFragmentManager();
switch(i) {
case 0:
newFragment = new Fragment2();
break;
case 1:
newFragment = new Fragment3();
break;
case 2:
newFragment = new Fragment4();
break;
case 3:
newFragment = new Fragment5();
break;
}
fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragback").commit();
drawerLayout.closeDrawer(rl);
}
@覆盖
公共无效onItemClick(AdapterView AdapterView、View视图、int i、long l){
Fragment newFragment=newmapspage();
FragmentManager fm=getSupportFragmentManager();
开关(一){
案例0:
newFragment=newfragment2();
打破
案例1:
newFragment=newfragment3();
打破
案例2:
newFragment=newfragment4();
打破
案例3:
newFragment=newfragment5();
打破
}
fm.beginTransaction().add(R.id.main,newFragment).addToBackStack(“fragback”).commit();
抽屉布局。封闭抽屉(rl);
}
而不是:
fm.beginTransaction().replace(R.id.main, newFragment).addToBackStack("fragBack").commit();
电话:
addToBackStack与add
一起使用
replace
函数删除以前的片段并放置新片段,以便在后堆栈中始终只有一个片段。所以,使用add函数将以前的片段保留在堆栈上
要始终从Backpress上的任何片段转到fragemnt1,请尝试执行以下操作:
getFragmentManager().popBackStack();
fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragBack").commit();
这将从backstack中删除最后一个事务并添加新事务。
试试这个。我建议您首先要正确管理事务,以避免覆盖
onBackPressed()
。这将有助于避免在将来实现疯狂的逻辑
为此,我们首先需要在中设置一个私有类变量,该变量将启用初始化:
private boolean popNext = false;
下面的代码允许我们通过将初始back函数放在堆栈上来设置它。此后,每当popNext
设置为true时,我们弹出初始事务并推送新事务。因此,我们将1>X事务替换为1>Y事务
额外嵌入的if
语句用于选择初始项,因为我们不想从1>1开始。如果这是我们的第一个案子,我们就关上抽屉。另一种情况需要像“后退”按钮一样操作,但我们需要记住将其设置为返回初始状态
if(popNext){
if(i == INITIAL_POSITION){
onBackPressed();
mDrawerLayout.closeDrawer(mDrawerList);
popNext = false;
return;
}
getFragmentManager().popBackStackImmediate();
}
else{
if(i == INITIAL_POSITION){
mDrawerLayout.closeDrawer(mDrawerList);
return;
}
popNext=true;
}
getFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, fragment)
.addToBackStack(null)
.commit();
注意:我的代码使用了
getFragmentManager()
而不是getSupportFragmentManager()
,这是一个本机函数,我相信是从Honeycomb开始的。我只是想报告我的发现,尽管这个问题对于其他可能有相同问题的人来说有点老了。对我来说,按照公认的答案中建议的方法,会使图层重叠,很快使其无法阅读。下面的代码(根据接受的答案改编)避免了重叠,但仍将屏幕添加到后堆栈中
fragmentManager.beginTransaction().replace(R.id.container, fragment).addToBackStack("fragBack").commit();
在某些情况下,您必须使用replace,然后无法使用addtobackstack(),以便可以在MainActivity中使用此代码。在这段代码中,当您按back键时,总是转到第一个片段(我称之为HomeFragment),当您在HomeFragment中时,它会要求两次从应用程序中退出
private Boolean exit = false;
@Override
public void onBackPressed() {
if (exit) {
super.onBackPressed();
return;
}
try {
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag("HOME");
if (fragment != null) {
if (fragment.isVisible()) {
this.exit = true;
Toast.makeText(this, "Press Back again to Exit", Toast.LENGTH_SHORT).show();
}
}
else {
fragment = HomeFragment.class.newInstance();
getFragmentManager().popBackStack();
fragmentManager.beginTransaction().replace(R.id.flContent, fragment, "HOME").commit();
}
} catch (Exception e) {
}
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
exit = false;
}
}, 2000);
}
-@覆盖
public void onBackPressed(){
抽屉布局抽屉=(抽屉布局)findViewById(R.id.抽屉布局);
int backstack=getSupportFragmentManager().getBackStackEntryCount();
if(抽屉isDrawerOpen(重力压缩机启动)){
抽屉。关闭抽屉(重力压缩机启动);
}否则如果(后退>0){
对于(int i=0;i
我有4个片段附加到底部导航活动
我最近遇到了这个问题,并成功地解决了如下问题
我的活动代码
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.NavigationUI;
import android.os.Bundle;
import android.view.MenuItem;
import com.google.android.material.bottomnavigation.BottomNavigationView;
public class BottomNavigationActivity extends AppCompatActivity
{
NavController navController;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bottom_navigation);
BottomNavigationView bottomNavigationView=findViewById(R.id.bottom_navigation);
bottomNavigationView.setOnNavigationItemSelectedListener(navListener);
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,new FragmentHome()).commit();
}
public boolean onSupportNavigateUp() {
return navController.navigateUp();
}
private BottomNavigationView.OnNavigationItemSelectedListener navListener= new
BottomNavigationView.OnNavigationItemSelectedListener()
{
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item)
{
Fragment selectedFragment = null ;
switch (item.getItemId())
{
case R.id.nav_home:
selectedFragment = new FragmentHome();
break;
case R.id.nav_search:
BottomNavigationActivity.this.getSupportFragmentManager().beginTransaction()
.addToBackStack(null)
.commit();
selectedFragment=new FragmentSearch();
break;
case R.id.nav_cart:
BottomNavigationActivity.this.getSupportFragmentManager().beginTransaction()
.addToBackStack(null)
.commit();
selectedFragment=new FragmentCart();
break;
case R.id.nav_user:
BottomNavigationActivity.this.getSupportFragmentManager().beginTransaction()
.addToBackStack(null)
.commit();
selectedFragment= new FragmentAccount();
break;
}
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
selectedFragment).commit();
return true;
}
};
@Override
public void onBackPressed()
{
int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
if (backStackEntryCount == 0) {
super.onBackPressed();
} else
{
goHome();
}
}
public void goHome()
{
//Following code will set the icon of the bottom navigation to active
final BottomNavigationView mBottomNav = findViewById(R.id.bottom_navigation);
MenuItem homeItem = mBottomNav.getMenu().getItem(0);
mBottomNav.setSelectedItemId(homeItem.getItemId());
getSupportFragmentManager().popBackStackImmediate();
//To delete all entries from back stack immediately one by one.
int backStackEntry = getSupportFragmentManager().getBackStackEntryCount();
for (int i = 0; i < backStackEntry; i++) {
getSupportFragmentManager().popBackStackImmediate();
}
//To navigate to the Home Fragment
final FragmentHome homeFragment = new FragmentHome();
FragmentTransaction myFragmentTransaction = getSupportFragmentManager().beginTransaction();
myFragmentTransaction.replace(R.id.fragment_container, homeFragment, "HomeFrag Tag");
myFragmentTransaction.commit();
}
}
import androidx.annotation.NonNull;
导入androidx.appcompat.app.appcompat活动;
导入androidx.fragment.app.fragment;
导入androidx.fragment.app.FragmentTransaction;
导入androidx.navigation.NavController;
导入androidx.navigation.navigation;
导入androidx.navigation.ui.NavigationUI;
导入android.os.Bundle;
导入android.view.MenuItem;
导入com.google.android.material.bottomnavigation.BottomNavigationView;
公共类BottomNavigationActivity扩展了AppCompativeActivity
{
导航控制器;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u bottom\u导航);
BottomNavigationView BottomNavigationView=findViewById(R.id.bottom\u导航);
bottomNavigationView.setOnNavigationItemSelectedListener(navListener);
getSupportFragmentManager().beginTransactio
- @Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
int backstack = getSupportFragmentManager().getBackStackEntryCount();
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else if (backstack > 0) {
for (int i = 0; i < backstack; i++) {
getSupportFragmentManager().popBackStackImmediate();
}
} else {
this.finish();
}
}
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.NavigationUI;
import android.os.Bundle;
import android.view.MenuItem;
import com.google.android.material.bottomnavigation.BottomNavigationView;
public class BottomNavigationActivity extends AppCompatActivity
{
NavController navController;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bottom_navigation);
BottomNavigationView bottomNavigationView=findViewById(R.id.bottom_navigation);
bottomNavigationView.setOnNavigationItemSelectedListener(navListener);
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,new FragmentHome()).commit();
}
public boolean onSupportNavigateUp() {
return navController.navigateUp();
}
private BottomNavigationView.OnNavigationItemSelectedListener navListener= new
BottomNavigationView.OnNavigationItemSelectedListener()
{
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item)
{
Fragment selectedFragment = null ;
switch (item.getItemId())
{
case R.id.nav_home:
selectedFragment = new FragmentHome();
break;
case R.id.nav_search:
BottomNavigationActivity.this.getSupportFragmentManager().beginTransaction()
.addToBackStack(null)
.commit();
selectedFragment=new FragmentSearch();
break;
case R.id.nav_cart:
BottomNavigationActivity.this.getSupportFragmentManager().beginTransaction()
.addToBackStack(null)
.commit();
selectedFragment=new FragmentCart();
break;
case R.id.nav_user:
BottomNavigationActivity.this.getSupportFragmentManager().beginTransaction()
.addToBackStack(null)
.commit();
selectedFragment= new FragmentAccount();
break;
}
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
selectedFragment).commit();
return true;
}
};
@Override
public void onBackPressed()
{
int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
if (backStackEntryCount == 0) {
super.onBackPressed();
} else
{
goHome();
}
}
public void goHome()
{
//Following code will set the icon of the bottom navigation to active
final BottomNavigationView mBottomNav = findViewById(R.id.bottom_navigation);
MenuItem homeItem = mBottomNav.getMenu().getItem(0);
mBottomNav.setSelectedItemId(homeItem.getItemId());
getSupportFragmentManager().popBackStackImmediate();
//To delete all entries from back stack immediately one by one.
int backStackEntry = getSupportFragmentManager().getBackStackEntryCount();
for (int i = 0; i < backStackEntry; i++) {
getSupportFragmentManager().popBackStackImmediate();
}
//To navigate to the Home Fragment
final FragmentHome homeFragment = new FragmentHome();
FragmentTransaction myFragmentTransaction = getSupportFragmentManager().beginTransaction();
myFragmentTransaction.replace(R.id.fragment_container, homeFragment, "HomeFrag Tag");
myFragmentTransaction.commit();
}
}