• 自定义底部工具栏及顶部工具栏和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();
    			}
    		});
    	}
    }
    



    运行相关效果图





  • 相关阅读:
    Educational Codeforces Round 28 B. Math Show
    Educational Codeforces Round 28 A. Curriculum Vitae
    Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) D. Jury Meeting
    Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) C. Planning
    2017 Multi-University Training Contest 2 hdu 6047
    2017 Multi-University Training Contest 2 hdu 6045
    2017 Multi-University Training Contest 1 hdu 6043
    2017 Multi-University Training Contest 1 hdu 6034
    2017 Multi-University Training Contest 1 hdu 6033
    poj 2104主席树求区间第k小
  • 原文地址:https://www.cnblogs.com/qiaoyihang/p/6166183.html
Copyright © 2020-2023  润新知