android 在fragment里的怎样实现滑动fragment

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 在fragment里的怎样实现滑动fragment相关的知识,希望对你有一定的参考价值。

参考技术A  按照一般的思路,我们或许会这么做:首先,使用getActionBar()方法获得操作栏,然后我们将操作栏的导航模式设置为Tab,并添加一些Tab,然后实现TabListener接口;其次,我们将多个布局通过Inflater()方法变成View,然后放到ViewPager里面,并实现OnPageChangeListener接口就可以了。由此我们可以写出下面的代码:

  package com.android.AnyViewUI;

  import java.util.ArrayList;

  import android.os.Bundle;
  import android.support.v4.app.FragmentActivity;
  import android.support.v4.app.FragmentManager;
  import android.support.v4.view.ViewPager;
  import android.support.v4.view.ViewPager.OnPageChangeListener;
  import android.app.ActionBar;
  import android.app.ActionBar.Tab;
  import android.app.ActionBar.TabListener;
  import android.app.Activity;
  import android.app.FragmentTransaction;
  import android.view.LayoutInflater;
  import android.view.View;

  public class MainActivity extends FragmentActivity implements TabListener,OnPageChangeListener

  private ActionBar mActionBar;
  private ViewPager mViewPager;
  private TabPagerAdapter mAdapter;
  private ArrayList<View> mViews;
  private ArrayList<ActionBar.Tab> mTabs;
  @Override
  protected void onCreate(Bundle savedInstanceState)
  super.onCreate(savedInstanceState);
  setContentView(R.layout.layout_main);
  //取得ActionBar
  mActionBar=getActionBar();
  //以Tab方式导航
  mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
  //禁用ActionBar标题
  mActionBar.setDisplayShowTitleEnabled(false);
  //禁用ActionBar图标
  mActionBar.setDisplayUseLogoEnabled(false);
  //禁用ActionBar返回键
  mActionBar.setDisplayShowHomeEnabled(false);
  //添加Tabs
  mTabs=new ArrayList<ActionBar.Tab>();

  ActionBar.Tab tab0=mActionBar.newTab();
  tab0.setText("界面一");
  tab0.setTabListener(this);
  mTabs.add(tab0);
  mActionBar.addTab(tab0);
  
  ActionBar.Tab tab1=mActionBar.newTab();
  tab1.setText("界面二");
  tab1.setTabListener(this);
  mTabs.add(tab1);
  mActionBar.addTab(tab1);
  
  ActionBar.Tab tab2=mActionBar.newTab();
  tab2.setText("界面三");
  tab2.setTabListener(this);
  mTabs.add(tab2);
  mActionBar.addTab(tab2);
  
  //获取ViewPager
  mViewPager=(ViewPager)findViewById(R.id.ViewPager);
  //初始化mViews
  mViews=new ArrayList<View>();
  mViews.add(LayoutInflater.from(this).inflate(R.layout.layout_0, null));
  mViews.add(LayoutInflater.from(this).inflate(R.layout.layout_1, null));
  mViews.add(LayoutInflater.from(this).inflate(R.layout.layout_2, null));
  //初始化mAdapter
  mAdapter=new TabPagerAdapter(mViews);
  mViewPager.setAdapter(mAdapter);
  mViewPager.setOnPageChangeListener(this);
  //默认显示第二项
  mViewPager.setCurrentItem(2);
  
  
  

  @Override
  public void onTabReselected(Tab mTab, FragmentTransaction arg1)
  

  

  @Override
  public void onTabSelected(Tab mTab, FragmentTransaction arg1)
  
  if(mViewPager!=null)
  
  mViewPager.setCurrentItem(mTab.getPosition());
  
  

  @Override
  public void onTabUnselected(Tab mTab, FragmentTransaction arg1)
  

  

  @Override
  public void onPageScrollStateChanged(int arg0)
  

  

  @Override
  public void onPageScrolled(int arg0, float arg1, int arg2)
  

  

  @Override
  public void onPageSelected(int Index)
  
  //设置当前要显示的View
  mViewPager.setCurrentItem(Index);
  //选中对应的Tab
  mActionBar.selectTab(mTabs.get(Index));
  

  
  其中,TabPagerAdapter是一个继承自PagerAdapter的适配器类:

  package com.Android.AnyViewUI;

  import java.util.ArrayList;

  import android.support.v4.view.PagerAdapter;
  import android.support.v4.view.ViewPager;
  import android.view.View;

  public class TabPagerAdapter extends PagerAdapter
  

  private ArrayList<View> mViews;
  public TabPagerAdapter(ArrayList<View> mViews)
  
  this.mViews=mViews;
  

  @Override
  public void destroyItem(View container, int position, Object object)
  
  ((ViewPager)container).removeView(mViews.get(position));
  

  @Override
  public Object instantiateItem(View container, int position)
  
  ((ViewPager)container).addView(mViews.get(position), 0);
  return mViews.get(position);
  

  @Override
  public int getCount()
  
  return mViews.size();
  

  @Override
  public boolean isViewFromObject(View mView, Object mObject)
  
  return (mView==mObject);
  

  

  我们的代码从逻辑上来讲是没有什么问题的,但是当我们试图运行这段代码的时候,我们发现这段代码出了问题,而问题就出在OnTabSelected()上。但是我们冷静下来想了想,没有错啊,那么问题到底出在哪里呢?看到网上的朋友说,这里这个适配器应该继承自FragmentPagerAdapter:

  package com.Android.AnyViewUI;

  import android.support.v4.app.Fragment;
  import android.support.v4.app.FragmentManager;
  import android.support.v4.app.FragmentPagerAdapter;

  public class ViewPagerAdapter extends FragmentPagerAdapter

  //定义三个Fragment的索引
  public static final int Fragment_Index_0=0;
  public static final int Fragment_Index_1=1;
  public static final int Fragment_Index_2=2;

  public ViewPagerAdapter(FragmentManager fragmentManager)
  
  super(fragmentManager);
  

  @Override
  public Fragment getItem(int Index)
  
  Fragment mFragemnt=null;
  switch(Index)
  
  case Fragment_Index_0:
  mFragemnt=new Fragment_0();
  break;
  case Fragment_Index_1:
  mFragemnt=new Fragment_1();
  break;
  case Fragment_Index_2:
  mFragemnt=new Fragment_2();
  break;
  
  return mFragemnt;
  

  @Override
  public int getCount()
  
  return 3;
  

  
  

  其中,Fragment_0、Fragment_1、Fragment_2是继承自Fragment的类,由于三个布局基本一样,这里只给出Fragment_0的代码:

  package com.Android.AnyViewUI;

  import android.os.Bundle;
  import android.support.v4.app.Fragment;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.ViewGroup;

  public class Fragment_0 extends Fragment
  

  public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
  
  View mView=inflater.inflate(R.layout.layout_0, container, false);
  return mView;
  

  本回答被提问者采纳

Android UI-实现底部切换标签(fragment)

Android UI-实现底部切换标签(fragment)


前言

本篇博客要分享的一个UI效果——实现底部切换标签,想必大家在一些应用上面遇到过这样的效果了,最典型的就是微信了,能够左右滑动切换页面。也能够点击标签页滑动页面,它们是怎样实现的呢,本篇博客为了简单仅仅介绍怎样实现点击底部切换标签页。
先来看看我们想实现的效果图:
技术分享
这样的页面实现起来事实上非常easy的,首先我们从布局入手:
分为三部分
第一部分:顶部导航栏布局
第二部分:中部显示内容布局
第三部分:底部标签布局

/BottomTabDemo/res/layout/activity_main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <RelativeLayout
        android:id="@+id/rl_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <!-- 顶部 -->

        <RelativeLayout
            android:id="@+id/top_tab"
            android:layout_width="match_parent"
            android:layout_height="50dip"
            android:background="@color/topbar_bg" >

            <ImageView
                android:id="@+id/iv_logo"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:focusable="false"
                android:src="@drawable/zhidao_logo"
                android:contentDescription="@null" />

        </RelativeLayout>

        <!-- 底部tab -->

        <LinearLayout
            android:id="@+id/ll_bottom_tab"
            android:layout_width="match_parent"
            android:layout_height="54dp"
            android:layout_alignParentBottom="true"
            android:gravity="center_vertical"
            android:orientation="horizontal" 
            android:baselineAligned="true">

            <RelativeLayout
                android:id="@+id/rl_know"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1.0" >

                <ImageView
                    android:id="@+id/iv_know"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                    android:src="@drawable/btn_know_nor" 
                    android:contentDescription="@null"/>

                <TextView
                    android:id="@+id/tv_know"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/iv_know"
                    android:layout_centerHorizontal="true"
                    android:text="@string/bottom_tab_know"
                    android:textColor="@color/bottomtab_normal"
                    android:textSize="12sp" />
            </RelativeLayout>

            <RelativeLayout
                android:id="@+id/rl_want_know"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1.0" >

                <ImageView
                    android:id="@+id/iv_i_want_know"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                    android:src="@drawable/btn_wantknow_nor"
                    android:contentDescription="@null" />

                <TextView
                    android:id="@+id/tv_i_want_know"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/iv_i_want_know"
                    android:layout_centerHorizontal="true"
                    android:text="@string/bottom_tab_wantknow"
                    android:textColor="@color/bottomtab_normal"
                    android:textSize="12sp" />
            </RelativeLayout>

            <RelativeLayout
                android:id="@+id/rl_me"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1.0" >

                <ImageView
                    android:id="@+id/iv_me"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                    android:src="@drawable/btn_my_nor"
                    android:contentDescription="@null" />
                

                <TextView
                    android:id="@+id/tv_me"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/iv_me"
                    android:layout_centerHorizontal="true"
                    android:text="@string/bottom_tab_my"
                    android:textColor="@color/bottomtab_normal"
                    android:textSize="12sp" />
            </RelativeLayout>
        </LinearLayout>

        <!-- 内容部分。 fragment切换 -->

        <LinearLayout
            android:id="@+id/content_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@+id/line"
            android:layout_below="@+id/top_tab"
            android:orientation="vertical" >
        </LinearLayout>

        <View
            android:id="@+id/line"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:layout_above="@id/ll_bottom_tab"
            android:background="@color/line" />
    </RelativeLayout>
    
</FrameLayout>
以上是布局代码,以下就介绍怎样通过点击标签切换Fragment:
我们会发现,初始的时候是选中第一个标签页,图片和字体的颜色差别于另外两个标签页,所以我们要做的就是切换标签的时候,就改变标签的状态
主要改两个内容:
  • 图片
  • 文字颜色

然后我们切换标签显示的是不同的Fragment,这里我们有三个Fragment,所以我们定义三个不同的Fragment界面:
/BottomTabDemo/src/com/xiaowu/bottomtab/demo/ZhidaoFragment.java
/BottomTabDemo/src/com/xiaowu/bottomtab/demo/IWantKnowFragment.java
/BottomTabDemo/src/com/xiaowu/bottomtab/demo/MeFragment.java
每一个Fragment相应不同的布局文件:
/BottomTabDemo/res/layout/main_tab1_fragment.xml
/BottomTabDemo/res/layout/main_tab2_fragment.xml
/BottomTabDemo/res/layout/main_tab3_fragment.xml

ok,这些定义好之后,我们就在主界面上编写切换的代码了,怎样对Fragment进行切换呢,定义以下方法:
/**
	 * 加入或者显示碎片
	 * 
	 * @param transaction
	 * @param fragment
	 */
	private void addOrShowFragment(FragmentTransaction transaction,
			Fragment fragment) {
		if (currentFragment == fragment)
			return;

		if (!fragment.isAdded()) { // 假设当前fragment未被加入。则加入到Fragment管理器中
			transaction.hide(currentFragment)
					.add(R.id.content_layout, fragment).commit();
		} else {
			transaction.hide(currentFragment).show(fragment).commit();
		}

		currentFragment = fragment;
	}


完整代码例如以下:
/BottomTabDemo/src/com/xiaowu/bottomtab/demo/MainActivity.java
package com.xiaowu.bottomtab.demo;



import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

/**
 * 主Activity
 * 
 * @author wwj_748
 * 
 */
public class MainActivity extends FragmentActivity implements OnClickListener {

	// 三个tab布局
	private RelativeLayout knowLayout, iWantKnowLayout, meLayout;

	// 底部标签切换的Fragment
	private Fragment knowFragment, iWantKnowFragment, meFragment,
			currentFragment;
	// 底部标签图片
	private ImageView knowImg, iWantKnowImg, meImg;
	// 底部标签的文本
	private TextView knowTv, iWantKnowTv, meTv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		initUI();
		initTab();
	}

	/**
	 * 初始化UI
	 */
	private void initUI() {
		knowLayout = (RelativeLayout) findViewById(R.id.rl_know);
		iWantKnowLayout = (RelativeLayout) findViewById(R.id.rl_want_know);
		meLayout = (RelativeLayout) findViewById(R.id.rl_me);
		knowLayout.setOnClickListener(this);
		iWantKnowLayout.setOnClickListener(this);
		meLayout.setOnClickListener(this);

		knowImg = (ImageView) findViewById(R.id.iv_know);
		iWantKnowImg = (ImageView) findViewById(R.id.iv_i_want_know);
		meImg = (ImageView) findViewById(R.id.iv_me);
		knowTv = (TextView) findViewById(R.id.tv_know);
		iWantKnowTv = (TextView) findViewById(R.id.tv_i_want_know);
		meTv = (TextView) findViewById(R.id.tv_me);

	}

	/**
	 * 初始化底部标签
	 */
	private void initTab() {
		if (knowFragment == null) {
			knowFragment = new ZhidaoFragment();
		}

		if (!knowFragment.isAdded()) {
			// 提交事务
			getSupportFragmentManager().beginTransaction()
					.add(R.id.content_layout, knowFragment).commit();

			// 记录当前Fragment
			currentFragment = knowFragment;
			// 设置图片文本的变化
			knowImg.setImageResource(R.drawable.btn_know_pre);
			knowTv.setTextColor(getResources()
					.getColor(R.color.bottomtab_press));
			iWantKnowImg.setImageResource(R.drawable.btn_wantknow_nor);
			iWantKnowTv.setTextColor(getResources().getColor(
					R.color.bottomtab_normal));
			meImg.setImageResource(R.drawable.btn_my_nor);
			meTv.setTextColor(getResources().getColor(R.color.bottomtab_normal));

		}

	}

	@Override
	public void onClick(View view) {
		switch (view.getId()) {
		case R.id.rl_know: // 知道
			clickTab1Layout();
			break;
		case R.id.rl_want_know: // 我想知道
			clickTab2Layout();
			break;
		case R.id.rl_me: // 我的
			clickTab3Layout();
			break;
		default:
			break;
		}
	}

	/**
	 * 点击第一个tab
	 */
	private void clickTab1Layout() {
		if (knowFragment == null) {
			knowFragment = new ZhidaoFragment();
		}
		addOrShowFragment(getSupportFragmentManager().beginTransaction(), knowFragment);
		
		// 设置底部tab变化
		knowImg.setImageResource(R.drawable.btn_know_pre);
		knowTv.setTextColor(getResources().getColor(R.color.bottomtab_press));
		iWantKnowImg.setImageResource(R.drawable.btn_wantknow_nor);
		iWantKnowTv.setTextColor(getResources().getColor(
				R.color.bottomtab_normal));
		meImg.setImageResource(R.drawable.btn_my_nor);
		meTv.setTextColor(getResources().getColor(R.color.bottomtab_normal));
	}

	/**
	 * 点击第二个tab
	 */
	private void clickTab2Layout() {
		if (iWantKnowFragment == null) {
			iWantKnowFragment = new IWantKnowFragment();
		}
		addOrShowFragment(getSupportFragmentManager().beginTransaction(), iWantKnowFragment);
		
		knowImg.setImageResource(R.drawable.btn_know_nor);
		knowTv.setTextColor(getResources().getColor(R.color.bottomtab_normal));
		iWantKnowImg.setImageResource(R.drawable.btn_wantknow_pre);
		iWantKnowTv.setTextColor(getResources().getColor(
				R.color.bottomtab_press));
		meImg.setImageResource(R.drawable.btn_my_nor);
		meTv.setTextColor(getResources().getColor(R.color.bottomtab_normal));

	}

	/**
	 * 点击第三个tab
	 */
	private void clickTab3Layout() {
		if (meFragment == null) {
			meFragment = new MeFragment();
		}
		
		addOrShowFragment(getSupportFragmentManager().beginTransaction(), meFragment);
		knowImg.setImageResource(R.drawable.btn_know_nor);
		knowTv.setTextColor(getResources().getColor(R.color.bottomtab_normal));
		iWantKnowImg.setImageResource(R.drawable.btn_wantknow_nor);
		iWantKnowTv.setTextColor(getResources().getColor(
				R.color.bottomtab_normal));
		meImg.setImageResource(R.drawable.btn_my_pre);
		meTv.setTextColor(getResources().getColor(R.color.bottomtab_press));
		
	}

	/**
	 * 加入或者显示碎片
	 * 
	 * @param transaction
	 * @param fragment
	 */
	private void addOrShowFragment(FragmentTransaction transaction,
			Fragment fragment) {
		if (currentFragment == fragment)
			return;

		if (!fragment.isAdded()) { // 假设当前fragment未被加入,则加入到Fragment管理器中
			transaction.hide(currentFragment)
					.add(R.id.content_layout, fragment).commit();
		} else {
			transaction.hide(currentFragment).show(fragment).commit();
		}

		currentFragment = fragment;
	}

}

源代码下载:http://download.csdn.net/detail/wwj_748/8495621


转载请注明:IT_xiao小巫
博客地址:http://blog.csdn.net/wwj_748
移动开发狂热者群:299402133

以上是关于android 在fragment里的怎样实现滑动fragment的主要内容,如果未能解决你的问题,请参考以下文章

android fragment怎么监听上下滑动

Android ViewPager + Fragment 实现导航栏(可以左右滑动)

Android中ViewPager实现滑动条及与Fragment结合的实例教程

Android之实现ViewPager+Fragment左右滑动

android怎么实现页面的左右滑动

Android- fragment结合ViewPager实现左右滑动