现在我进入我的第一个问题,在互联网上找不到答案。通常情况下,这应该是一件非常容易的事情,但它花了我几个小时,所以请原谅我,如果这是一个初学者的问题。另外,我想确定我走的路是对的,然后再花更多的时间来看看,最终它不是我想要的,而是我实现它的方式-- atm。
问题:
我的应用程序有3个选项卡,3个片段作为内容,每个选项卡一个。我使用Tabs是因为我问的所有用户都想要Tabs,而不是导航抽屉,我听的是用户,而不是google (对不起)。另外,这三个选项卡有非常不同的“角色”(语言指南、货币转换器和自己的短语笔记本等等),这样划分它是有意义的(imo)。如果有人有其他的想法,那就去吧,我打开:-)
到目前为止,标签导航的工作原理是一样的。但现在我想为单张表建立进一步的导航,我不确定还能不能.这么简单的事情有很多种方法..。
第一个选项卡有一些imageButtons以进一步导航到本节(请参见Screen快照1),以便在语言部分中选择一个类别。当然,这意味着制表符应该保持在适当的位置,以便能够轻松地切换到转换器,也就是说,只需将制表符1中的片段切换到新的片段(请参阅屏幕快照2),依此类推。您在下面的屏幕截图中看到的按钮具有将当前片段更改为新片段的单击监听器(如“每日”)
为此,我打开另一个片段并将其添加到后台。也许你已经可以猜到现在发生了什么。如果我按下后退按钮,我当然会回到第一个片段。当在选项卡1上打开一个片段时,当我切换制表符时,问题就开始了。添加的片段仍然处于后台,这意味着如果我按下tab 2或3上的后退按钮,显示的内容会与其他片段的内容发生某种程度的混淆。见截图3
我是在这里出错了,还是在切换选项卡时,我可以简单地告诉后台“重置”,这样就不会出现这个问题了?
谢谢你的信息,很抱歉语言和拼写错误,英语不是我的主要语言。
Tablistener类以切换选项卡片段:
public class MyTabListener implements ActionBar.TabListener {
Fragment fragment;
public MyTabListener(Fragment fragment) {
this.fragment = fragment;
}
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
ft.replace(R.id.fragment_container, fragment);
}
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
ft.remove(fragment);
}
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
// nothing done here
}
}
第一个片段中的片段类如下所示(不是完整代码):
public static class FragmentTab1 extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
final View view = inflater.inflate(R.layout.tab, container, false);
ImageButton catBtn_Daily = (ImageButton) view.findViewById(R.id.catBtn_Daily);
ImageButton catBtn_OnTheRoad = (ImageButton) view.findViewById(R.id.catBtn_OnTheRoad);
ImageButton catBtn_Shopping = (ImageButton) view.findViewById(R.id.catBtn_Shopping);
ImageButton catBtn_Restaurant = (ImageButton) view.findViewById(R.id.catBtn_Restaurant);
ImageButton catBtn_Romance = (ImageButton) view.findViewById(R.id.catBtn_Romance);
ImageButton catBtn_Emergency = (ImageButton) view.findViewById(R.id.catBtn_Emergency);
// attach an OnClickListener
catBtn_Daily.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Create new fragment and transaction
Fragment newFragment = new FragmentTab4();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
transaction.setTransition(4097);
transaction.commit();
}
});
主要活动:
public class MainActivity extends Activity {
ActionBar.Tab tab1, tab2, tab3;
Fragment fragmentTab1 = new FragmentTab1();
Fragment fragmentTab2 = new FragmentTab2();
Fragment fragmentTab3 = new FragmentTab3();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tab_test);
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
tab1 = actionBar.newTab().setText("Home");
tab2 = actionBar.newTab().setText("Calculator");
tab3 = actionBar.newTab().setText("Notebook");
tab1.setTabListener(new MyTabListener(fragmentTab1));
tab2.setTabListener(new MyTabListener(fragmentTab2));
tab3.setTabListener(new MyTabListener(fragmentTab3));
actionBar.addTab(tab1);
actionBar.addTab(tab2);
actionBar.addTab(tab3);
还不能发照片,代表太低.
请看这里(第三张图片叫做无题-3.png)
屏幕1:https://www.dropbox.com/s/3av3pf6a17p2w42/Untitled-1.png
屏幕2:https://www.dropbox.com/s/3av3pf6a17p2w42/Untitled-2.png
屏幕3:https://www.dropbox.com/s/3av3pf6a17p2w42/Untitled-3.png
发布于 2014-07-05 12:35:11
最好不要使用片段回堆栈。您可以维护自己的堆栈并覆盖onBackPressed()
以提供适当的行为。
@Override protected void onBackPressed()
{
if(myStack.isEmpty())
super.onBackPressed(); // default handling finishes the activity
else
{
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, myStack.pop());
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
transaction.commit();
}
}
发布于 2014-07-05 12:53:28
您可以尝试如下:
public void onTabSelected(YourTab tab) {
Fragment fragment = new YourTabFragment();
replaceRootFragment(fragment);
}
public void replaceRootFragment(Fragment fragment) {
if (getSupportFragmentManager().getBackStackEntryCount() != 0) {
int id = getSupportFragmentManager().getBackStackEntryAt(0).getId();
try {
getSupportFragmentManager().popBackStackImmediate(id, FragmentManager.POP_BACK_STACK_INCLUSIVE);
} catch (IllegalStateException e) {
return;
}
}
getSupportFragmentManager().beginTransaction()
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
.replace(R.id.container, fragment)
.commit();
}
单击选项卡时调用onTabSelected。
发布于 2014-07-05 14:20:50
实际上,听起来你可能想考虑一种完全不同的方法。如果我的理解是正确的,您可能想考虑使用ViewPager和FragmentPagerAdapter (参见这里的google示例:FragmentPagerAdapter)。
从本质上说,viewpager显示了选项卡下面的片段,适配器提供了要显示的片段列表,您可以通过在viewpager上调用setCurrentItem来选择当前的“页面”(当用户单击一个选项卡时)。此外,用户还可以在页面之间滑动(您可以通过监听寻呼机事件来更新所选选项卡,参见google示例:ViewPager)。
这种方法避免了整个叠后问题,听起来更像是你想要的东西。
希望能帮上忙。
https://stackoverflow.com/questions/24590211
复制