- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
按后退按钮后,单击按钮时显示的新 fragment 不会关闭,而是关闭整个应用程序。该按钮位于三个选项卡之一内。 mainActivity.java、HeroesFragment(具有三个选项卡的 fragment )、StrengthHeroesFragment(具有按钮的三个选项卡之一)的代码如下。
MainActivity.java
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
private DrawerLayout drawer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar=findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
drawer=findViewById(R.id.draw_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();
if (savedInstanceState==null){
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,new HeroesFragment()).commit();
navigationView.setCheckedItem(R.id.nav_heroes);}
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.nav_heroes:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,new HeroesFragment()).commit();
break;
case R.id.nav_items:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,new ItemsFragment()).commit();
break;
case R.id.nav_counterpicker:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,new CounterPickerFragment()).commit();
break;
case R.id.nav_news:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,new NewsFragment()).commit();
break;
}
drawer.closeDrawer(GravityCompat.START);
return true;
}
@Override
public void onBackPressed() {
if (drawer.isDrawerOpen(GravityCompat.START)){
drawer.closeDrawer(GravityCompat.START);
}
else{
super.onBackPressed();
}
}
}
HeroesFragment.java(包含三个选项卡的 fragment )
public class HeroesFragment extends Fragment {
private TabLayout tabLayout;
private AppBarLayout appBarLayout;
private ViewPager viewPager;
View view;
RelativeLayout relativeLayout;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view= inflater.inflate(R.layout.fragment_heroes,container,false);
relativeLayout=(RelativeLayout)view.findViewById(R.id.hero_layout);
tabLayout=(TabLayout)view.findViewById(R.id.heroes_tablayout);
appBarLayout=(AppBarLayout)view.findViewById(R.id.hero_appbar);
viewPager=(ViewPager)view.findViewById(R.id.heroes_viewpager);
ViewPageAdapter adapter=new ViewPageAdapter(getChildFragmentManager(),1);
adapter.AddFragment(new StrengthHeroesFragment(),"Strength" );
adapter.AddFragment(new AgilityHeroesFragment(),"Agility");
adapter.AddFragment(new IntelligenceHeroesFragment(),"Intelligence");
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
switch (tab.getPosition()){
case 0:
Toast.makeText(getContext(),"Tab 1",Toast.LENGTH_SHORT).show();
break;
case 1:
Toast.makeText(getContext(),"Tab 2",Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(getContext(),"tab 3",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
return view;
}
}
StrengthHeroesFragment.java(包含按钮的 fragment )
public class StrengthHeroesFragment extends Fragment {
View view;
ImageButton ib1,ib2,ib3,ib4,ib5,ib6;
TextView t1,t2,t3,t4,t5,t6;
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable
Bundle savedInstanceState) {
view=inflater.inflate(R.layout.fragment_strength_heroes,container,false);
ib1=(ImageButton)view.findViewById(R.id.abaddon_icon);
ib1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
HeroDetailsFragment heroDetailsFragment=new HeroDetailsFragment();
Bundle data=new Bundle();
data.putString("heroname","Abaddon");
heroDetailsFragment.setArguments(data);
FragmentTransaction transaction=getChildFragmentManager().beginTransaction();
transaction.replace(R.id.strength_hero_layout,heroDetailsFragment).addToBackStack(null);
transaction.commit();
}
});
return view;
}
}
当我在 StrengthHeroes fragment 中使用 getFragmentManager() 而不是 getChildFragmentManager() 时,它实际上可以工作,但是当我切换到抽屉导航中的另一个 fragment 时,选项卡布局 fragment 中的内容消失了。我还尝试使用 setPrimaryNavigationFragment() 它仍然不起作用。请帮我解决一下......提前致谢。
最佳答案
使用下面的代码代替 super.onBackpress()
@Override
public void onBackPressed() {
if (drawer.isDrawerOpen(GravityCompat.START)){
drawer.closeDrawer(GravityCompat.START);
}
else{
getSupportFragmentManager().popBackStack();
}
}
关于java - addToBackStack() 不适用于 getChildFragmentManager(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60466038/
在 Android 上的 FragmentTransaction 项中 docs ,说明方法replace()与调用方法remove()是一样的,对当前view中添加的所有fragment调用方法添加
我正在尝试关闭 fragment 并希望通过在我的 fragment 实现中使用 addToBackStack 来恢复主要 Activity ,但它不起作用。后退按钮正在关闭应用程序。 我使用的 fr
在我的应用程序中,我正在处理一个显示不同 fragment 的 Activity 。该 Activity 还具有抽屉布局。 activity_main.xml: 所以现在我试图通过替换它们
我就是不明白。 我有一个 Activity A、一个 Fragment F1 和一个 Fragment F2。当 Activity 启动时,它会通过 F1 打开 getFragmentManager(
我的 MainActivity 管理两个一起工作的 fragment 。我的方法之一是我的 ListFragment 上的监听器接口(interface),MainActivity 负责切换 frag
这是负责将 fragment 添加到后台堆栈的函数: public void populateContent(File f) { ContentFragment cf = new Conten
有什么办法可以让这个更干净一点吗?我知道当 query = ""时我位于主菜单,因此返回应该关闭应用程序。 if (query == "") { fragmen
当我们在 fragment 中使用 addToBackStack() 时如何设置动画? 我的旧片段需要保留,新片段应该将旧片段与动画重叠并显示给用户。 我尝试了 setCustomAnimation(
按后退按钮后,单击按钮时显示的新 fragment 不会关闭,而是关闭整个应用程序。该按钮位于三个选项卡之一内。 mainActivity.java、HeroesFragment(具有三个选项卡的 f
我被它弄糊涂了。 我有一个 Activity A,Fragment F1 和 F2,当单击一个按钮时,我想隐藏 F1 并将 F2 添加到同一位置,然后可以通过后退按钮返回到 F1。所以我做了如下。
这是我的主要 Activity 。我关注了this guide关于 fragment 正确。当我单击“后退”按钮时,我的应用程序关闭而不是返回到 MainScreenFragment。为什么会发生这种
我有一个 FragmentActivity,它在启动时加载一个自定义 ListFragment,并在单击某项后用新 fragment 替换它。 在 fragment Activity 子类中: pub
每当我按下我的应用程序的后退按钮时,就会发生以下情况。 原创手机展示:FragA 点击 FragA 上的 View 后手机展示:FragB 点击返回按钮后手机显示: fragment A fragme
我正在研究 Fragments,在区分 FragmentTransaction.replace(id, fragment, tag) 和 FragmentTransaction.addToBackSt
当我按下“后退”按钮(在模拟器和 Galaxy S2 上测试)时,无论提交了多少 fragment 事务,应用程序都会关闭:( 好吧,以防万一,我会发布我的 fragment 事务的实现,尽管我怀疑它
我的应用程序有选项卡,在一个选项卡中,我有一个带有 ListView 的 fragment 。单击列表中的项目时,我尝试使用以下内容在该选项卡下初始化一个新 fragment : private cl
我在使用 FragmentTransaction addToBackStack 时发现了一个奇怪的行为。每当手机旋转时,它都会重新创建堆栈中的所有 fragment 。为什么要重新创建这些 fragm
我在抽屉导航 Activity 中创建了一个选项卡式 Activity 。我已将抽屉导航内的列表与各个 fragment 链接起来。我还在 ft.commit() 之前使用了命令 ft.addToBa
我没有找到解决问题的方法。 我有几个 fragment (动态创建),但我的后退按钮根本不起作用,按下它将关闭应用程序,无论 fragment 是“Activity 的”。 @Override pub
具有添加 fragment 和稍后的 replace() fragment 的流程。所有 fragment 都是动态添加的,但不是所有 fragment 都调用addToBackStack()。 ge
我是一名优秀的程序员,十分优秀!