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
博客地址:http://blog.csdn.net/wwj_748
移动开发狂热者群:299402133
以上是关于android 在fragment里的怎样实现滑动fragment的主要内容,如果未能解决你的问题,请参考以下文章
Android ViewPager + Fragment 实现导航栏(可以左右滑动)
Android中ViewPager实现滑动条及与Fragment结合的实例教程