【问题标题】:Android - How to use the ActionBar to navigate between FragmentsAndroid - 如何使用 ActionBar 在 Fragment 之间导航
【发布时间】:2013-04-09 15:13:16
【问题描述】:

对 ActionBar 和 Fragments 不熟悉,但对 Android 大体熟悉。

我一直在关注一些教程。到目前为止,我有以下内容:

  • 3 Fragments 我想在它们之间导航(每个都有一个覆盖的 onCreateView() 并加载一个简单的视图)
  • ActionBar 的自定义TabListener(我相信问题就在那里,代码见帖子底部)
  • 一个托管Activity,这一切都在其中进行

活动代码:

public class Activity_Home extends Activity
{
ActionBar actionBar;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    actionBar = getActionBar();  // Get reference to ActionBar

    // Add some navigation tabs...

    // 1. Enable ActionBar navigation tabs
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionBar.setDisplayShowTitleEnabled(false);

    // 2. Add the tabs
    Tab programTab = actionBar.newTab();
    Tab settingsTab = actionBar.newTab();
    Tab historyTab = actionBar.newTab();

    programTab.setText("Program")
              .setTabListener(new TabListener<Fragment_Program>(
                      this, R.id.fragmentParent, Fragment_Program.class));

    settingsTab.setText("Settings")
               .setTabListener(new TabListener<Fragment_Settings>(
                      this, R.id.fragmentParent, Fragment_Settings.class));

    historyTab.setText("History")
      .setTabListener(new TabListener<Fragment_History>(
              this, R.id.fragmentParent, Fragment_History.class));

    actionBar.addTab(programTab);
    actionBar.addTab(settingsTab);
    actionBar.addTab(historyTab);
}
}

我的片段:

public class Fragment_Program extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState)
{
    return inflater.inflate(R.layout.fragment_program, null);
}
}

..

public class Fragment_History extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState)
{
    return inflater.inflate(R.layout.fragment_history, null);
}
}

..

public class Fragment_Settings extends Fragment
{   
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState)
{
    return inflater.inflate(R.layout.fragment_settings, null);
}   
}

最后,我的 TabListener 几乎基于 Google 官方示例。 fragmentContainer (int) 是所有这些 Fragments 的直接父活动布局中 LinearLayout 的 XML 资源 ID。

public class TabListener <T extends Fragment> implements ActionBar.TabListener
{
private Fragment fragment;
private int fragmentContainer;
private final Activity activity;
private final Class<T> fragmentClass;

/** Constructor used each time a new tab is created.
 * @param activity  The host Activity, used to instantiate the fragment
 * @param tag  The identifier tag for the fragment
 * @param fragmentClass  The fragment's Class, used to instantiate the fragment
 */
public TabListener(Activity activity, int fragmentContainer, Class<T> fragmentClass)
{
    this.activity = activity;
    this.fragmentContainer = fragmentContainer;
    this.fragmentClass = fragmentClass;
}

@Override
public void onTabReselected(Tab arg0, FragmentTransaction arg1)
{
    // User selected the already selected tab. Usually do nothing.      
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft)
{
    // Check if the fragment is already intialized
    if (fragment == null)
    {
        // If not, instatiate and add it to the Activity
        fragment = Fragment.instantiate(activity, fragmentClass.getName());

        ft.add(fragmentContainer, fragment);
    }       
    else
    {
        ft.attach(fragment);
    }
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft)
{
    if (fragment != null)
    {
        // Detach the fragment, because another one is being attached
        ft.detach(fragment);
    }
}   

}

所以应用程序加载,选项卡在那里,我可以选择它们,但它们似乎没有相互链接,我不确定如何继续。

任何建议都会很棒!

干杯

BONUS QUESTION:ActionBar 也在现有 ActionBar 下方。目标是替换它,而不是在下面再制作一个。再次,任何建议都会很棒!

【问题讨论】:

    标签: java android android-fragments android-activity android-actionbar


    【解决方案1】:

    修好了!

    根据此示例 Good complete Fragment and ActionBar example 和 Google 官方示例,我将方法从使用带有字符串标签的 Fragment Container ID(这对我来说确实并且仍然更有意义..)进行了更改。

    【讨论】:

    • 很高兴你完成了它。
    【解决方案2】:

    我想你希望标签以一种可以在标签之间滑动的方式连接,为了实现这一点,你应该考虑ViewPager

    顺便说一下,这是 XML:

    <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:orientation="vertical">
    
    <android.support.v4.view.ViewPager 
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>
    
    </LinearLayout>
    

    这里有一些你可以使用的示例代码:

    public class MyTabActivity extends FragmentActivity implements ActionBar.TabListener, ViewPager.OnPageChangeListener  {
    
      //What item on the pager is being displayed
        private int mCurPagerItem = 0;
      //This will be set to the pageer to handle navigation
        private SectionsPagerAdapter mSectionsPagerAdapter;
        private ViewPager mViewPager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_home);
    
            final ActionBar mActionBar = getActionBar();
            mActionBar.setDisplayShowHomeEnabled(false);
            mActionBar.setDisplayShowTitleEnabled(false);
            mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    
            //add the tabs
            mActionBar.addTab(mActionBar.newTab().setIcon(R.drawable.your_icon).setTabListener(this));
            mActionBar.addTab(mActionBar.newTab().setIcon(R.drawable.your_icon2).setTabListener(this));
            mActionBar.addTab(mActionBar.newTab().setIcon(R.drawable.your_icon3).setTabListener(this));
    
            mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
    
            mViewPager = (ViewPager) findViewById(R.id.pager);
            mViewPager.setAdapter(mSectionsPagerAdapter);
            mViewPager.setOnPageChangeListener(this);           
    
        }
    
        public class SectionsPagerAdapter extends FragmentPagerAdapter {
    
            public SectionsPagerAdapter(FragmentManager fm) {
                super(fm);
            }
    
            @Override
            public Fragment getItem(int position) {
                switch (position) {
                case 0:
                    Fragment one = new Fragment_Program();
                    return one ;
                case 1:
                    Fragment two = new Fragment_Settings();
                    return two ;
                case 2:
                    Fragment three = new Fragment_History();
                    return three ;
                default:
                    break;
                }
                return null;
            }
    
            @Override
            public int getCount() {
                return 3;
            }
    
            @Override
            public CharSequence getPageTitle(int position) {
                switch (position) {
                case 0:
                    return getString(R.string.title_one);
                case 1:
                    return getString(R.string.title_two);
                case 2:
                    return getString(R.string.title_three);
                }
                return null;
            }
        }
    
        @Override
        public void onPageScrollStateChanged(int arg0) {}
    
        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {}
    
        @Override
        public void onPageSelected(int arg0) {
            //When a Page is selected, make that the current navigation item
            getActionBar().setSelectedNavigationItem(arg0);
        }
    
        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            //Back to top maybe?
        }
    
        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            //get the position
            final int pos = tab.getPosition();
            //Tell the viewpager to scroll to that page
            mViewPager.setCurrentItem(pos);
            mCurPagerItem = pos;
        }
    
        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        }
    

    要回答您的额外问题,请尝试在您的清单上添加以下带有指定活动标签的行:

    android:uiOptions="splitActionBarWhenNarrow"
    

    【讨论】:

    • 这不是我真正想要实现的目标,不涉及页面滑动。但无论如何,谢谢你,感谢你的时间,这似乎在未来可能会派上用场!不幸的是,这对 ActionBar 也没有帮助,它将 ActionBar 的上半部分拆分为下半部分。问题是我目前有那个显示软菜单按钮所在的栏,而我的带有选项卡的 ActionBar 就在下面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多