【问题标题】:Android fragment transaction with SlidingTabLayout not working in API level < 21具有 SlidingTabLayout 的 Android 片段事务在 API 级别 < 21 中不起作用
【发布时间】:2015-03-28 17:06:34
【问题描述】:

在我的应用程序中,我有一个 ActionBarActivity(我正在使用带有 AppCompat 的支持库),它使用 Google 的 SlidingTabLayout 类(取自 here)。所以这是 Activity 布局的 XML 代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_series_details"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".SeriesDetailsActivity">

    <com.my.package.SlidingTabLayout
        android:id="@+id/series_details_tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:elevation="2dp"
        android:background="@color/primary_material_dark" />
    <android.support.v4.view.ViewPager
        android:id="@+id/series_details_pager"
        android:layout_height="0dp"
        android:layout_width="match_parent"
        android:layout_weight="1" />
</LinearLayout>

在这个活动中,当用户在操作栏中按下一个选项时,我想添加一个带有自定义动画的片段。这是处理菜单点击的代码:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        /* ... OTHER CASES ... */
        case R.id.menu_voption:
            newFragment = MyNewFragment.newInstance();                
            getSupportFragmentManager().beginTransaction()
                    .setCustomAnimations(
                            R.anim.slide_up,
                            R.anim.slide_down
                    )
                    .add(R.id.activity_series_details, newFragment)
                    .commit();
            editing = true;
            break;
        default:
            return super.onOptionsItemSelected(item);
    }
    return true;

这样做,我的新片段被正确添加到活动中并替换当前片段而不是选项卡布局,它仍然可见。所以我尝试在开始交易之前添加这一行:

tabsHost.setVisibility(View.GONE);

其中tabsHost 是SlidingTabLayout。通过此修改,选项卡布局消失并且新片段正确显示,但仅在 API 级别 >= 21 中。在我的三星 Galaxy S4(运行 API 19)和所有其他 API 级别低于 21 的模拟器中(我的目标是 11+),选项卡布局消失但新片段不可见。我很确定是我的错,但我不知道为什么。谢谢大家的关注。

【问题讨论】:

    标签: android android-fragments android-appcompat android-tabs


    【解决方案1】:

    由于SlidingTabLayout 不是一个片段,它不能被FragmentManager 管理。您必须使其成为片段的一部分并将其添加到您的活动中。 getChildFragmentManager 可以做到这一点。

    将您的活动布局移动到片段:

    activity_main.xml

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_series_details"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>
    

    fragment_sliding_tab.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_series_details"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <com.my.package.SlidingTabLayout
            android:id="@+id/series_details_tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:elevation="2dp"
            android:background="@color/primary_material_dark" />
        <android.support.v4.view.ViewPager
            android:id="@+id/series_details_pager"
            android:layout_height="0dp"
            android:layout_width="match_parent"
            android:layout_weight="1" />
    </LinearLayout>
    

    SlidingTabFragment.java

    public class SlidingTabFragment extends Fragment {
        private PagerAdapter mPagerAdapter;
        private ViewPager mViewPager;
    
        public static SlidingTabFragment newInstance() {
            SlidingTabFragment fragment = new SlidingTabFragment();
            return fragment;
        }
    
        public SlidingTabFragment() {
            // Required empty public constructor
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
    
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
        }
    
        @Override
        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
    
            mPagerAdapter = new PagerAdapter(getChildFragmentManager());
    
            // Set up the ViewPager with the sections adapter.
            mViewPager = (ViewPager) view.findViewById(R.id.series_details_pager);
            mViewPager.setAdapter(mSectionsPagerAdapter);
    
            SlidingTabLayout tabs = (SlidingTabLayout) view.findViewById(R.id.series_details_tabs);
            tabs.setViewPager(mViewPager);
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_sliding_tab, container, false);
        }
    }
    

    将您的片段添加到您的 Activity 的onCreate

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Fragment slidingTabFragment = SlidingTabFragment.newInstance();
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.activity_series_details, slidingTabFragment).commit();
    }
    

    【讨论】:

    • 感谢 karaokyo,您的回答有效。现在我只需要一些努力来重新安排代码。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    相关资源
    最近更新 更多