Android 片段选项卡主机 + viewpager 滑动?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/26381850/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 11:20:16  来源:igfitidea点击:

Android fragment tab host + viewpager swipe?

androidfragmentswipe

提问by Boldijar Paul

I currently have a fragment tab host, made by this tutorial http://maxalley.wordpress.com/2013/05/18/android-creating-a-tab-layout-with-fragmenttabhost-and-fragments/

我目前有一个片段标签主机,由本教程制作 http://maxalley.wordpress.com/2013/05/18/android-creating-a-tab-layout-with-fragmenttabhost-and-fragments/

The only difference is that I'm using this inside a fragment. So I have a fragment with the tabs, each tab has another fragment..

唯一的区别是我在片段中使用它。所以我有一个带有标签的片段,每个标签都有另一个片段..

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TabWidget
        android:id="@android:id/tabs"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom" />

    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />


</LinearLayout>

The fragment class

片段类

public class AddServiceFragment extends Fragment {




    public AddServiceFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


    }


    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_add_service, container, false);
        FragmentTabHost mTabHost = (FragmentTabHost) view.findViewById(android.R.id.tabhost);
        mTabHost.setup(getActivity(), getChildFragmentManager(), android.R.id.tabcontent);


        String[] tabs = new String[]{"text1", "text2"};
        mTabHost.addTab(
                mTabHost.newTabSpec("tab1").setIndicator(tabs[0], null),
                MedicalHistoryFragment.class, null);


        mTabHost.addTab(
                mTabHost.newTabSpec("tab2").setIndicator(tabs[1], null),
                MedicalHistoryFragment.class, null);

            return view;
    }

This works, I can see my tabs. Now I want to implement a viewpager, in order to be able to swipe left or right.

这有效,我可以看到我的标签。现在我想实现一个viewpager,以便能够向左或向右滑动。

I've read this from the android developer page http://developer.android.com/training/animation/screen-slide.html

我已经从 android 开发者页面http://developer.android.com/training/animation/screen-slide.html读到了这个

But I can't figure out, where should I put my viewpager? I want my fragment to be independent of my activity...

但我想不通,我应该把我的viewpager放在哪里?我希望我的片段独立于我的活动......

回答by krossovochkin

TabHost doesn't provide ViewPager support.
Also, I suggest you to not use TabHost – this is old style.
Use PagerTabStrip

TabHost 不提供 ViewPager 支持。
另外,我建议你不要使用 TabHost——这是旧风格。
使用PagerTabStrip

Look this Gist.

看看这个要点

UPD:I add some code, for case, if this Gist be deleted;

UPD:我添加了一些代码,以防万一,如果这个 Gist 被删除;

MainActivity.java

主活动.java

package ch.pboos.android.sample.viewpager;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
        viewPager.setAdapter(new SampleFragmentPagerAdapter());
    }

    public class SampleFragmentPagerAdapter extends FragmentPagerAdapter {
        final int PAGE_COUNT = 5;

        public SampleFragmentPagerAdapter() {
            super(getSupportFragmentManager());
        }

        @Override
        public int getCount() {
            return PAGE_COUNT;
        }

        @Override
        public Fragment getItem(int position) {
            return PageFragment.create(position + 1);
        }
    }

    public static class PageFragment extends Fragment {
        public static final String ARG_PAGE = "ARG_PAGE";

        private int mPage;

        public static PageFragment create(int page) {
            Bundle args = new Bundle();
            args.putInt(ARG_PAGE, page);
            PageFragment fragment = new PageFragment();
            fragment.setArguments(args);
            return fragment;
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mPage = getArguments().getInt(ARG_PAGE);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_page, container, false);
            TextView textView = (TextView) view;
            textView.setText("Fragment #" + mPage);
            return view;
        }
    }
}

activity_main.xml (without PagerTabStrip)

activity_main.xml(不带 PagerTabStrip)

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</android.support.v4.view.ViewPager>

activity_main_2.xml (with PagerTabStrip)

activity_main_2.xml(带有PagerTabStrip)

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v4.view.PagerTabStrip
        android:id="@+id/pager_header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:background="#000"
        android:paddingBottom="4dp"
        android:paddingTop="4dp"
        android:textColor="#fff" />

</android.support.v4.view.ViewPager>

fragment_page.xml

fragment_page.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center" />

getPageTitle

获取页面标题

public CharSequence getPageTitle(int position) {
    return "Page " + (position + 1);
}

UPD 2With Fragment:

UPD 2带片段:

public class MainFragment extends Fragment{

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.activity_main_2, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
        viewPager.setAdapter(new SampleFragmentPagerAdapter());
    }

    public class SampleFragmentPagerAdapter extends FragmentPagerAdapter {
        final int PAGE_COUNT = 5;

        public SampleFragmentPagerAdapter() {
            super(getSupportFragmentManager());
        }

        @Override
        public int getCount() {
            return PAGE_COUNT;
        }

        @Override
        public Fragment getItem(int position) {
            return PageFragment.create(position + 1);
        }
    }

    public static class PageFragment extends Fragment {
        public static final String ARG_PAGE = "ARG_PAGE";

        private int mPage;

        public static PageFragment create(int page) {
            Bundle args = new Bundle();
            args.putInt(ARG_PAGE, page);
            PageFragment fragment = new PageFragment();
            fragment.setArguments(args);
            return fragment;
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mPage = getArguments().getInt(ARG_PAGE);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_page, container, false);
            TextView textView = (TextView) view;
            textView.setText("Fragment #" + mPage);
            return view;
        }
    }
}

Hope it helps

希望能帮助到你

回答by Arpit Patel

use the following solution i have put the view page like below.. and my work done..

使用以下解决方案,我已经将视图页面如下所示..我的工作完成了..

<RelativeLayout 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"
    tools:context=".MainActivity" >

<TabHost
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:orientation="horizontal" />

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0" />

        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:overScrollMode="never" />
    </LinearLayout>
</TabHost>

回答by user3173628

You can implement the viewpager as a library.

您可以将 viewpager 实现为库。

First thing you need to import viewpager project to the eclipse workspace. [ I think you are modifying the project :Tabhost example]

首先需要将 viewpager 项目导入到 eclipse 工作区。[我认为您正在修改项目:Tabhost 示例]

so right click your Tabhost example project thn build path -> configure build path.. thn click Android ...when you click android you can see 2 section Project build Target & Library.So in Library you can add the viewpager Library.

所以右键单击你的 Tabhost 示例项目然后构建路径 -> 配置构建路径..然后点击 Android ...当你点击 android 你可以看到 2 部分项目构建目标和库。所以在库中你可以添加 viewpager 库。

回答by user3173628

Inorder to include viewpager library to the project ,you should import the library
"Existing Project” to your current one.

为了将 viewpager 库包含到项目中,您应该将库
“现有项目”导入到您当前的项目中。

Step 1:-Download source code from GitHub.(https://github.com/JakeWharton/Android-ViewPagerIndicator)

第 1 步:-从 GitHub 下载源代码。(https://github.com/JakeWharton/Android-ViewPagerIndicator

Step2 :-In your Android Studio Project: File -> Project Structure -> add (+ symbol) -> Import Existing Project. Import just the folder called ”library”, not the entire project (leave the import options as Android Studio suggests).

步骤 2:-在您的 Android Studio 项目中:文件 -> 项目结构 -> 添加(+ 符号)-> 导入现有项目。只导入名为“library”的文件夹,而不是整个项目(保留 Android Studio 建议的导入选项)。

step 3:-If the "compileSdkVersion" specified in your build.gradle doesn't match with the one specified in the Android-ViewPagerIndicator project, change the second one. The same apply with any other property, such as "minSdkVersion" or even the current support library.

第3步:-如果build.gradle中指定的“compileSdkVersion”与Android-ViewPagerIndicator项目中指定的不匹配,请更改第二个。这同样适用于任何其他属性,例如“minSdkVersion”甚至当前的支持库。

Step 4:-Add Android-ViewPagerIndicator project as a dependency to your build.gradle module: dependencies { compile project(':library') }

第 4 步:-将 Android-ViewPagerIndicator 项目添加为 build.gradle 模块的依赖项:dependencies { compile project(':library') }

Step 5:- Sync project with gradle files.

第 5 步:- 将项目与 gradle 文件同步。