`
yo8237233
  • 浏览: 62990 次
  • 来自: 深圳
社区版块
存档分类
最新评论

自定义底部工具栏及顶部工具栏和Fragment配合使用demo

阅读更多
    首先简单的介绍下fragment,fragment是android3.0新增的概念,其中文意思是碎片,它与activity非常相似,用来在一个activity中描述一些行为或一部分用户界面。使用锁个fragment可以再一个单独的activity中建立多个UI面板,也可以在多个activity中重用fragment,一个fragment必须被嵌入到一个activity中,它的生命周期直接受其所宿主的activity的生命周期的影响。
    首先创建一个fragment,要创建一个fragment,必须创建一个fragment的子类,或者继承自另外一个已经存在的Fragment的子类,并重写相应的方法。
    编写Fragment的xml文件和类文件,这里我写了四个,贴出来其中两个代码,其他的copy就行。


fragment_main.xml
<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" >

	<TextView 
	    android:layout_height="wrap_content"
	    android:layout_width="wrap_content"
	    android:gravity="center"
	    android:text="主页面"
	    />

</RelativeLayout>


MainFragment.java
public class MainFragment extends Fragment{
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.fragment_main, container,false);
		return view;
	}
	
	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
	}

}


fragment_grxx.xml
<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" >
    
    <com.qyh.view.TitleView 
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

	<TextView 
	    android:layout_height="wrap_content"
	    android:layout_width="wrap_content"
	    android:gravity="center"
	    android:text="个人信息"
	    />

</RelativeLayout>


GrxxFragment.java
public class GrxxFragment extends Fragment{
	private TitleView titleView;
	private FragmentActivity mActivity;
	private View mParent;
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.fragment_grxx, container,false);
		return view;
	}
	
	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		mActivity = getActivity();
		mParent = getView();
		titleView = (TitleView) mActivity.findViewById(R.id.title);
		titleView.setTitle("个人信息");
		titleView.setBackButton(new TitleView.OnBackButtonClickListener() {
			@Override
			public void onClick(View button) {
				getFragmentManager().beginTransaction()
				.hide(com.qyh.main.MainActivity.mFragments[1])
				.show(com.qyh.main.MainActivity.mFragments[0]).commit();
				FragmentIndicator.setIndicator(0);
			}
		});
	}

}



自定义底部工具栏
FragmentIndicator.java
public class FragmentIndicator extends LinearLayout implements OnClickListener {

	private static String TAG = "FragmentIndicator";
	private int mDefaultIndicator = 0;// 默认位置
	private static int mCurIndicator;// 当前位置
	private static View[] mIndicators;
	private OnIndicateListener mOnIndicateListener;

	private static final String TAG_ICON_0 = "icon_tag_0";
	private static final String TAG_ICON_1 = "icon_tag_1";
	private static final String TAG_ICON_2 = "icon_tag_2";
	private static final String TAG_ICON_3 = "icon_tag_3";

	private FragmentIndicator(Context context) {
		super(context);
	}

	public FragmentIndicator(Context context, AttributeSet attrs) {
		super(context, attrs);
		mCurIndicator = mDefaultIndicator;
		setOrientation(LinearLayout.HORIZONTAL);
		initView();
	}

	private View createIndicator(int iconResID, int stringResID,
			int stringColor, String iconTag, String textTag) {
		LinearLayout view = new LinearLayout(getContext());

		view.setOrientation(LinearLayout.HORIZONTAL);
		view.setLayoutParams(new LinearLayout.LayoutParams(
				LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT,1));
		view.setGravity(Gravity.CENTER);

		ImageView iconView = new ImageView(getContext());
		iconView.setTag(iconTag);
		iconView.setLayoutParams(new LinearLayout.LayoutParams(
				LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT, 1));
		iconView.setImageResource(iconResID);
		view.addView(iconView);
		return view;
	}

	private void initView() {
		mIndicators = new View[4];
		mIndicators[0] = createIndicator(R.drawable.main_home, 0, 0, TAG_ICON_0,
				null);
		mIndicators[0].setBackgroundResource(R.drawable.indic_select);
		mIndicators[0].setTag(Integer.valueOf(0));
		mIndicators[0].setOnClickListener(this);
		addView(mIndicators[0]);

		mIndicators[1] = createIndicator(R.drawable.main_user, 0, 0, TAG_ICON_1,
				null);
		mIndicators[1].setBackgroundResource(Color.alpha(0));
		mIndicators[1].setTag(Integer.valueOf(1));
		mIndicators[1].setOnClickListener(this);
		addView(mIndicators[1]);

		mIndicators[2] = createIndicator(R.drawable.main_set, 0, 0, TAG_ICON_2,
				null);
		mIndicators[2].setBackgroundResource(Color.alpha(0));
		mIndicators[2].setTag(Integer.valueOf(2));
		mIndicators[2].setOnClickListener(this);
		addView(mIndicators[2]);

		mIndicators[3] = createIndicator(R.drawable.main_more, 0, 0,
				TAG_ICON_3, null);
		mIndicators[3].setBackgroundResource(Color.alpha(0));
		mIndicators[3].setTag(Integer.valueOf(3));
		mIndicators[3].setOnClickListener(this);

		addView(mIndicators[3]);
	}

	public static void setIndicator(int which) {
		// 以前状态
		mIndicators[mCurIndicator].setBackgroundColor(Color.alpha(0));
		ImageView prevIcon;
		switch (mCurIndicator) {
		case 0:
			prevIcon = (ImageView) mIndicators[mCurIndicator]
					.findViewWithTag(TAG_ICON_0);
			prevIcon.setImageResource(R.drawable.main_home);
			break;
		case 1:
			prevIcon = (ImageView) mIndicators[mCurIndicator]
					.findViewWithTag(TAG_ICON_1);
			prevIcon.setImageResource(R.drawable.main_user);
			break;
		case 2:
			prevIcon = (ImageView) mIndicators[mCurIndicator]
					.findViewWithTag(TAG_ICON_2);
			prevIcon.setImageResource(R.drawable.main_set);
			break;
		case 3:
			prevIcon = (ImageView) mIndicators[mCurIndicator]
					.findViewWithTag(TAG_ICON_3);
			prevIcon.setImageResource(R.drawable.main_more);
			break;
		default:
			break;
		}
		Log.i(TAG, "setIndicator:mCurIndicator=" + mCurIndicator);
		// 更新当前状态
		mIndicators[which].setBackgroundResource(R.drawable.indic_select);
		ImageView currIcon;
		switch (which) {
		case 0:
			currIcon = (ImageView) mIndicators[which]
					.findViewWithTag(TAG_ICON_0);
			currIcon.setImageResource(R.drawable.main_home_hover);// 选中后的图片
			break;
		case 1:
			currIcon = (ImageView) mIndicators[which]
					.findViewWithTag(TAG_ICON_1);
			currIcon.setImageResource(R.drawable.main_user_hover);
			break;
		case 2:
			currIcon = (ImageView) mIndicators[which]
					.findViewWithTag(TAG_ICON_2);
			currIcon.setImageResource(R.drawable.main_set_hover);
			break;
		case 3:
			currIcon = (ImageView) mIndicators[which]
					.findViewWithTag(TAG_ICON_3);
			currIcon.setImageResource(R.drawable.main_more_hover);
			break;
		default:
			break;
		}
		mCurIndicator = which;
	}

	public interface OnIndicateListener {
		public void onIndicate(View v, int which);
	}

	public void setOnIndicateListener(OnIndicateListener listener) {
		mOnIndicateListener = listener;
	}

	@Override
	public void onClick(View v) {
		if (mOnIndicateListener != null) {
			int tag = (Integer) v.getTag();
			switch (tag) {
			case 0:
				if (mCurIndicator != 0) {
					mOnIndicateListener.onIndicate(v, 0);
					setIndicator(0);
				}
				break;
			case 1:
				if (mCurIndicator != 1) {
					mOnIndicateListener.onIndicate(v, 1);
					setIndicator(1);
				}
				break;
			case 2:
				if (mCurIndicator != 2) {
					mOnIndicateListener.onIndicate(v, 2);
					setIndicator(2);
				}
				break;
			case 3:
				if (mCurIndicator != 3) {
					mOnIndicateListener.onIndicate(v, 3);
					setIndicator(3);
				}
				break;
			default:
				break;
			}

		}

	}

}


自定义顶部工具栏
title_view.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="48dip"
    android:background="#18222E" >

    <ImageButton
        android:id="@+id/ib_back"
        android:layout_width="48dp"
        android:layout_height="match_parent"
        android:src="@drawable/ic_titleback" 
        />

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:text="个人信息"/>
    
    <ImageButton
        android:id="@+id/ib_handle"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:layout_marginRight="12dp"
        android:visibility="gone"/>

</FrameLayout>


TitleView.java
/**
 * 功能描述:自定义顶部工具栏
 */
public class TitleView extends FrameLayout implements View.OnClickListener {
	public OnBackButtonClickListener mOnBackButtonClickListener;
	public OnHandleButtonClickListener mHandleButtonClickListener;
	private TextView mTitle;
	private ImageButton mBackButton;
	private ImageButton ib_handle;

	public TitleView(Context context) {
		this(context, null);
	}

	public TitleView(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public TitleView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);

		LayoutInflater inflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		inflater.inflate(R.layout.title_view, this, true);
		mBackButton = (ImageButton) findViewById(R.id.ib_back);
		mBackButton.setOnClickListener(this);
		mTitle = (TextView) findViewById(R.id.tv_title);
		mTitle.setVisibility(View.INVISIBLE);
		ib_handle = (ImageButton) findViewById(R.id.ib_handle);
		ib_handle.setOnClickListener(this);
	}

	public interface OnBackButtonClickListener {
		public void onClick(View button);
	}

	public interface OnHandleButtonClickListener {
		public void onClick(View button);
	}

	/**
	 * 标题返回按钮
	 * 
	 * @param listener
	 */
	public void setBackButton(OnBackButtonClickListener listener) {
		mOnBackButtonClickListener = listener;
	}
	
	public void showBackBtn(){
		mBackButton.setVisibility(View.VISIBLE);
	}
	
	public void hiddenBackBtn(){
		mBackButton.setVisibility(View.GONE);
	}
	
	/**
	 * 标题操作按钮
	 * 
	 * @param listener
	 */
	public void setHandleButton(OnHandleButtonClickListener listener) {
		mHandleButtonClickListener = listener;
	}
	
	public void hiddenHandleBtn(){
		ib_handle.setVisibility(View.GONE);
	}
	
	public void showHandleBtn(int iamgeBtnID){
		ib_handle.setImageResource(iamgeBtnID);
		ib_handle.setVisibility(View.VISIBLE);
	}
//设置标题
	public void setTitle(String text) {
		mTitle.setVisibility(View.VISIBLE);
		mTitle.setText(text);
	}

	public void setTitle(int stringID) {
		mTitle.setVisibility(View.VISIBLE);
		mTitle.setText(stringID);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.ib_back:
			if (mOnBackButtonClickListener != null) {
				mOnBackButtonClickListener.onClick(v);
			}
			break;
		case R.id.ib_handle:
			if (mHandleButtonClickListener != null) {
				mHandleButtonClickListener.onClick(v);
			}
			break;
		default:
			break;
		}
	}

}


在main.xml里面添加相关fragment和自定义底部工具栏,注意name属性
<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="vertical" >

    <fragment
        android:id="@+id/fragment_main"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:name="com.qyh.fragment.MainFragment" />

    <fragment
        android:id="@+id/fragment_grxx"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:name="com.qyh.fragment.GrxxFragment" />

    <fragment
        android:id="@+id/fragment_sz"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:name="com.qyh.fragment.SzFragment" />

    <fragment
        android:id="@+id/fragment_others"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:name="com.qyh.fragment.OthersFragment" />
    
    <!--此处为自定义底部菜单栏  -->
    <com.qyh.fragment.FragmentIndicator
        android:id="@+id/indicator"
        android:layout_width="fill_parent"
        android:layout_height="48dp"
        />

</LinearLayout>


在主线程中对fragment做相关操作
public class MainActivity extends FragmentActivity {
	
	public static Fragment[] mFragments;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);
		setFragmentIndicator(0);

	}
	
	private void setFragmentIndicator(int whichIsDefault) {
		mFragments = new Fragment[4];
		mFragments[0] = getSupportFragmentManager().findFragmentById(
				R.id.fragment_main);
		mFragments[1] = getSupportFragmentManager().findFragmentById(
				R.id.fragment_grxx);
		mFragments[2] = getSupportFragmentManager().findFragmentById(
				R.id.fragment_sz);
		mFragments[3] = getSupportFragmentManager().findFragmentById(
				R.id.fragment_others);
		getSupportFragmentManager().beginTransaction().hide(mFragments[0])
				.hide(mFragments[1]).hide(mFragments[2]).hide(mFragments[3])
				.show(mFragments[whichIsDefault]).commit();

		FragmentIndicator mIndicator = (FragmentIndicator) findViewById(R.id.indicator);
		FragmentIndicator.setIndicator(whichIsDefault);
		mIndicator.setOnIndicateListener(new OnIndicateListener() {

			@Override
			public void onIndicate(View v, int which) {
				getSupportFragmentManager().beginTransaction()
						.hide(mFragments[0]).hide(mFragments[1])
						.hide(mFragments[2]).hide(mFragments[3])
						.show(mFragments[which]).commit();
			}
		});
	}
}


运行相关效果图





  • 大小: 32.6 KB
  • 大小: 35.4 KB
分享到:
评论

相关推荐

    新浪微博Android版底部工具栏的Demo

    本Demo是针对新浪微博Android版的底部工具栏实现,旨在帮助开发者了解如何在自己的应用中实现类似的功能。 首先,我们要理解底部工具栏的设计原则。根据Google的Material Design规范,底部工具栏应该包含3到5个主要...

    ViewPager+Fragment_Demo

    【ViewPager+Fragment_Demo】是一个基于Android开发的项目示例,它展示了如何使用ViewPager和Fragment来构建一个功能完善的Tab导航栏。在Android应用设计中,Tab导航是一种常见的用户界面模式,用于展示多个相关的...

    Android 三种不同底部导航栏的

    本篇文章将详细探讨Android中的三种不同底部导航栏实现方式:TabLayout、BottomNavigationView以及FragmentTabHost,并提供一个名为`FragmentDemo`的示例代码来帮助理解。 首先,让我们来看看TabLayout。TabLayout...

    fragment使用的demo

    在底部菜单栏的实现中,通常会使用TabLayout配合ViewPager来管理多个Fragment。TabLayout提供标签,而ViewPager负责滑动切换不同的Fragment。首先,你需要为每个Fragment创建一个对应的PagerAdapter子类,如`...

    底部导航demo

    在Android应用开发中,底部导航(Bottom ...通过"底部导航demo",开发者可以学习如何在Android应用中实现底部导航功能,同时掌握Fragment的管理和Navigation组件的使用,从而创建出用户友好、易于导航的应用。

    触摸波纹反馈、底部导航栏控制器demo

    在这个“触摸波纹反馈、底部导航栏控制器demo”中,开发者将展示如何集成和自定义RippleView以实现动态、美观的交互界面。 首先,我们要了解RippleEffect是如何工作的。RippleEffect是通过`android:background="?...

    ActionBar和Fragment的经典实例

    在Android应用开发中,`ActionBar`和`Fragment`是两个非常关键的组件,尤其是在3.0及以上版本。它们为开发者提供了更加丰富和灵活的界面设计能力。本实例将深入探讨这两个组件的使用方法以及如何结合它们来提升用户...

    自定义键盘Demo

    "自定义键盘Demo"就是这样一个实例,它展示了如何在Android应用中实现这些功能。下面我们将深入探讨自定义键盘的关键技术和实现步骤。 1. **创建自定义键盘布局** 自定义键盘首先需要一个XML布局文件,包含各种...

    android 主界面 底部菜单 DEMO

    `CoordinatorLayout`可以配合`AppBarLayout`实现与底部菜单的联动效果,如滑动隐藏/显示顶部栏。 6. **生命周期管理**: 当Fragment随着底部菜单的切换而替换时,必须注意其生命周期管理。比如,确保在正确的时间...

    JMeter-Test Fragment的使用demo下载

    提供的"demo"压缩包包含了使用Test Fragment的一个示例测试计划。解压后,你可以打开JMeter并加载这个计划来了解Test Fragment如何与其他组件交互,以及如何在实际测试场景中发挥作用。通过分析和运行这个示例,你将...

    Android 设置一个底部控件view随着软键盘的弹出而上移

    为了改善这种情况,开发者通常需要实现一个功能,使得底部的视图(如工具栏、按钮等)能够随着软键盘的弹出而上移。下面将详细解释如何在Android中实现这个功能。 首先,我们需要理解Android布局的工作原理。在默认...

    这个是Android studio 使用kotlin语音开发的项目。实现底部导航栏demo

    总的来说,这个项目展示了如何利用Kotlin的高效性和Android Studio的强大工具来实现底部导航栏功能。Kotlin的使用使得代码更简洁、可读性更强,同时也提高了开发效率。通过学习这个项目,开发者可以进一步掌握Kotlin...

    底部导航+图片轮播demo

    本Demo旨在教你如何实现这两个特性,类似于微信应用中的底部导航栏和广告轮播图。 底部导航通常包含3到5个主要功能的图标和文字标签,用户可以通过点击底部的图标在不同页面间轻松切换。在微信应用中,底部导航包括...

    沉浸式状态栏demo

    由于你提到Fragment的实现在另一个demo中,这意味着你需要结合那个demo来理解和实现Fragment中的沉浸式状态栏。 5. **调整布局**: 当状态栏变得透明后,需要确保应用的布局不会被状态栏遮挡。可以使用`...

    Android开发-FragmentTransaction-Fragment增加隐藏显示-完整Demo-AndroidStuidio

    FragmentTransaction则是管理Fragment操作的核心工具,它提供了添加、删除、替换、隐藏和显示Fragment的功能。本篇将深入探讨FragmentTransaction以及如何在Android Studio中实现一个完整的FragmentTransaction示例...

    actionbar+fragment+viewpager

    1. **Actionbar**:Actionbar是Android应用顶部的一条工具栏,用于显示应用的标识、标题以及操作按钮。它提供了一个统一的用户界面模式,使用户能够快速访问主要功能。自Android 3.0(Honeycomb)版本引入,后来在...

    android 自定义菜单

    在Android应用开发中,自定义菜单是提升用户体验和界面交互性的重要手段。本文将深入探讨如何在Android系统中实现两种不同...无论是底部菜单还是顶部工具栏,理解其工作原理和实现方式对于提升应用的交互体验至关重要。

    fragmenttabDemo

    在Android应用开发中,`FragmentTabHost`是一个用于在Activity中实现底部标签栏切换不同Fragment的组件。`FragmentTabHost`结合了`TabHost`和`Fragment`的优势,使得我们能够在不支持`Fragment`的API版本(如Android...

    BottomNavigationView底部导航demo

    【BottomNavigationView底部导航demo】是Android开发中的一个关键知识点,用于在应用的底部提供一种便捷的多页面切换方式。在Android应用设计中,底部导航栏(Bottom Navigation)是一种常见的界面元素,它允许用户...

    屏蔽下拉状态栏demo

    它可能包括一个自定义的Activity或Fragment,这些组件会拦截并处理状态栏的触摸事件,防止用户下拉。 2. **Root方法**:由于修改系统核心组件(如`android.jar`)通常需要系统权限,因此可能需要设备root才能完成。...

Global site tag (gtag.js) - Google Analytics