我是Android开发的新手,我在使用ActionBar可滑动标签模型时遇到问题。我知道每个选项卡都有一个片段,ViewPager处理调用每个新片段。在那之后,我有点失落。
我已经成功创建了4个带有自己布局的标签,但是在每个标签中更改布局时遇到了问题。根据我的研究,似乎我应该从一个空布局的片段开始,然后在适当的时候添加和替换片段。
在我的下面的代码中,我想将“fragment_search_bar”添加到空的“fragment_search”中一次。这似乎有效,但当我导航到其他选项卡并返回时,搜索栏会消失。当我返回到与其相邻的标签的搜索标签时,它有时会再次出现。理想情况下,当按下按钮时,我希望搜索栏被搜索结果的下一个片段替换(我认为一旦我理解了当前的问题,这将很容易完成)。
我很确定即使经过大量阅读,我也不完全熟悉片段生命周期。
SearchFragment.java
public class SearchFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_search, container, false);
if (rootView.findViewById(R.id.fragment_search_bar) == null) {
FragmentSearchBar searchBar = new FragmentSearchBar();
searchBar.setRetainInstance(true);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_search, searchBar, "search_bar");
fragmentTransaction.addToBackStack("search_bar");
fragmentTransaction.commit();
}
fragment_search.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:id="@+id/fragment_search" >
</LinearLayout>
fragment_search_bar.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:id="@+id/fragment_search_bar" >
<EditText android:id="@+id/search_query"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="@string/search_prompt" />
<Button android:id="@+id/search_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/search_button" />
</LinearLayout>
答案 0 :(得分:0)
我不确定是什么原因导致您的问题,您是否可以添加所有相关组件(ViewPager,FragmentPagerAdapter等)?
这对我有用:我和你有同样的想法,所以我将替换功能封装在一个类HostFragment
中,该类附带了一个能够跟踪后面导航历史记录的替换方法。
public void replaceFragment(Fragment fragment, boolean addToBackstack) {
if (addToBackstack) {
getChildFragmentManager().beginTransaction().replace(R.id.hosted_fragment, fragment).addToBackStack(null).commit();
} else {
getChildFragmentManager().beginTransaction().replace(R.id.hosted_fragment, fragment).commit();
}
}
所有方法都是使用提供给方法的片段替换id R.id.hosted_fragment
的帧布局。
现在我只需要使用HostFragment
的实例来初始化我的ViewPager的页面,这些实例承载我需要的特定类型的片段。根据视图寻呼机的要求,该工作在自定义FragmentPagerAdapter类中完成。为了显示可点击的标签栏,我还添加了一个标签布局。
检查我的tutorial on this topic以获取更多详细信息和GitHub上的完整工作示例!
答案 1 :(得分:0)
听起来你需要缓存你的页面。试试
mViewPager.setOffscreenPageLimit(3);
在您调用viewpager的位置添加此行。当您导航到其他选项卡时,android仅保存当前片段,一个左侧和一个右侧。所以将offscreenpagelimit设置为3将告诉android保存当前,3右和3左。