我正在尝试创建一个具有滚动标签以进行导航的应用。在整个周末尝试实现此功能后,我基本上已经用尽了所有选择。我想要做的是在这张图片中描述:。
我试过了:
我能得到的最远的是单独的片段和一个TabsAdapter类,它在主要活动和ViewPager中实现FragmentPagerAdapter。但是我无法找到一种方法将相应的活动附加到片段,以便用我需要输出的元素更新UI(计算器类型的应用程序)。
我应该如何实施这样的解决方案?非常感谢有人指出我正确的方向。
答案 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);
}
});
}