具有多个活动的可滚动选项卡

时间:2014-03-31 17:33:02

标签: android android-intent android-fragments android-activity android-tabs

我正在尝试创建一个具有滚动标签以进行导航的应用。在整个周末尝试实现此功能后,我基本上已经用尽了所有选择。我想要做的是在这张图片中描述:http://i.imgur.com/CC7kKeM.png

我试过了:

  • 在主要活动中实现FragmentPagerAdapter的Tab类
  • 单独碎片
  • 意图
  • ViewPager

我能得到的最远的是单独的片段和一个TabsAdapter类,它在主要活动和ViewPager中实现FragmentPagerAdapter。但是我无法找到一种方法将相应的活动附加到片段,以便用我需要输出的元素更新UI(计算器类型的应用程序)。

我应该如何实施这样的解决方案?非常感谢有人指出我正确的方向。

1 个答案:

答案 0 :(得分:2)

您需要使用具有单个Activity的片段和ViewPager。我在这里简单地演示了如何执行此操作:https://github.com/lt-tibs1984/InterfaceDemo

您可以下载zip文件并将其导入IDE。

基本思想是带有选项卡式导航的Activity包含3个片段。您可以滑动选项卡,或使用选项卡本身进行导航。

这也说明了片段和活动之间通过接口进行的沟通。

<强>更新

所以我想我会更多地解释一下这个项目及其实际做法。

private final static String [] m_fragmentClasses = {"com.divshark.interfacedemo.fragments.Fragment1","com.divshark.interfacedemo.fragments.Fragment2","com.divshark.interfacedemo.fragments.Fragment3"};
private final static String [] m_fragmentTitles = {"Fragment 1","Fragment 2", "Fragment 3"};

 private class MyViewPagerAdapter extends FragmentPagerAdapter{

    /**
     * @param fm the Activity's Fragment Manager
     */
    public MyViewPagerAdapter(FragmentManager fm) {
        // Call to the Super Class
        super(fm);
    }

    /* (non-Javadoc)
     * @see android.support.v4.app.FragmentPagerAdapter#getItem(int)
     */
    @Override
    public Fragment getItem(int position) {
        // Fragment currentFragment to return
        Fragment currentFragment = null;

        // Loop through the Fragment Classes and Instantiate the Fragment at the current Position
        if((m_fragmentClasses != null) && (m_fragmentClasses.length > 0) && (position >= 0) && (position < m_fragmentClasses.length))
        {
            // Instantiate the current Fragment
            currentFragment = Fragment.instantiate(getBaseContext(), m_fragmentClasses[position]);
            currentFragment.setRetainInstance(true);
        }

        // Return the CurrentFragment
        return currentFragment;
    }

    /* (non-Javadoc)
     * @see android.support.v4.view.PagerAdapter#getCount()
     */
    @Override
    public int getCount() {
        // Return the Length of the Fragment Classes Array
        return m_fragmentClasses.length;
    }

}

此代码片段是此项目中获取可滑动标签的最重要部分。 正如您在getItem()方法覆盖中看到的那样,每个片段都是静态实例化的。

因此,当在Activity中实例化此适配器时,所有片段都会委派给Adapter而不是活动。

默认情况下,基类FragmentPagerAdapter将3个片段加载到内存中:当前片段,前面是1,后面是1。通过在每个片段上调用setRetainInstance(true),我们告诉片段保持其状态。这仅适用于少量片段,其中FragmentStatePagerAdapter应该用于大量片段,因为它会在不使用时将片段破坏,从而将更少的数据加载到内存中。

希望这有助于您更好地理解代码。如果您有任何其他问题,请随时提出。

更新2

你的onCreateView()方法应该只返回膨胀的布局,如下所示:

/*
 * (non-Javadoc)
 * 
 * @see
 * android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater,
 * android.view.ViewGroup, android.os.Bundle)
 */
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // Inflate the layout from the XML Resource
    return inflater.inflate(R.layout.fragment_layout_1, container, false);
}

然后创建所有UI元素作为类的成员变量,扩展Fragment并获得对它们的引用,如此

选项1:

在onViewCreated()方法中,在onCreateView()

之后立即调用

选项2:

在你的onActivityCreated()

在我的示例中,我在onViewCreated()中执行此操作并获取对它们的引用,如此

/* (non-Javadoc)
 * @see android.support.v4.app.Fragment#onViewCreated(android.view.View, android.os.Bundle)
 */
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onViewCreated(view, savedInstanceState);

    m_textFragment1 = (TextView) getView().findViewById(R.id.textViewFragment1);
    m_btnFragment1 = (Button) getView().findViewById(R.id.btnFragment1);
    m_btnFragment1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // Communicate with The Parent Activity
            m_callBack.SendMessageToParent(FRAGMENT_TAG);

        }

    });
}