標籤:text struct 交流 alt abs scroll 標識 lis 適配
1.首先上
2.本例實現的效果主要適用於當前頁面有多個頁簽時。進行Fragment切換時,能夠利用不同的Menu樣式與當前Fragment中的內容進行配合,能夠大大添加複用性,看到後,以下我來介紹我實現這一效果的主要步驟
2.1 由於此處我有3個樣式,那麼我須要在res/menu 目錄下建立三個檔案,style1.xml,style2.xml,style3.xml.這裡我以style1.xml為例。詳細的文字表徵圖檔案可依照需求,style2.xml,style3.xml類似。
style1.xml 原始碼例如以下:
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_item1" android:orderInCategory="100" android:showAsAction="ifRoom|withText" android:icon="@drawable/ic_menu_discard" android:title="@string/style1"/></menu>
2.2 在res/layout 檔案下 分別建立activity 與fragment的相應視圖檔案,我拿Activity與當中一個Fragment舉例,剩下的大家能夠舉一反三
activity_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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" > </android.support.v4.view.ViewPager> </RelativeLayout>
fragment_first原始碼
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" ><TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="第一個Fragment" /></RelativeLayout>
2.3 接下來就是邏輯實現了,依照效果我須要建立一個主邏輯Activity與三個Fragment邏輯檔案,這裡我相同僅僅拿一個Fragment舉例。剩下兩個類似
FirstFragment原始碼:
package com.yqc.menuswitchdemo;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;public class FirstFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View rootView = inflater.inflate(R.layout.fragment_first, container,false);return rootView;}}
當中,在使用Fragment時須要一個自己定義適配器,原始碼例如以下:
package com.yqc.menuswitchdemo;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentPagerAdapter;public class LFFragmentPagerAdapter extends FragmentPagerAdapter {Fragment[] fragmentArray;public LFFragmentPagerAdapter(FragmentManager fm,Fragment[] fragmentArray2) {super(fm);// TODO Auto-generated constructor stubif (null == fragmentArray2) {this.fragmentArray = new Fragment[] {};} else {this.fragmentArray = fragmentArray2;}}@Overridepublic Fragment getItem(int arg0) {// TODO Auto-generated method stubreturn fragmentArray[arg0];}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn fragmentArray.length;}}
最後,MainActivity原始碼:
package com.yqc.menuswitchdemo;import android.os.Bundle;import android.app.ActionBar;import android.app.ActionBar.Tab;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.widget.Toast;/** * @author YangQiCong 楊奇聰 QQ群 90733929 歡迎交流 */public class MainActivity extends FragmentActivity {private ViewPager viewPager;private ActionBar actionBar;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);viewPager = (ViewPager) findViewById(R.id.viewpager);Fragment fragment1 = new FirstFragment();Fragment fragment2 = new SecondFragment();Fragment fragment3 = new ThirdFragment();Fragment[] fragmentArray = new Fragment[] { fragment1, fragment2,fragment3 };LFFragmentPagerAdapter adapter = new LFFragmentPagerAdapter(getSupportFragmentManager(), fragmentArray);viewPager.setAdapter(adapter);viewPager.setOffscreenPageLimit(3);viewPager.setOnPageChangeListener(new OnPageChangeListener() {@Overridepublic void onPageSelected(int arg0) {// TODO Auto-generated method stubSystem.out.println("arg0:" + arg0);actionBar.setSelectedNavigationItem(arg0);}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {// TODO Auto-generated method stub}@Overridepublic void onPageScrollStateChanged(int arg0) {// TODO Auto-generated method stub}});actionBar = getActionBar();// 設定ActionBar 的導航方式: Tab導航actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);// actionBar.getTab tab1 = actionBar.newTab().setText("頁簽1").setIcon(android.R.drawable.ic_menu_agenda).setTabListener(new ActionTabListener(fragment1));Tab tab2 = actionBar.newTab().setText("頁簽2").setIcon(android.R.drawable.ic_menu_agenda).setTabListener(new ActionTabListener(fragment2));Tab tab3 = actionBar.newTab().setText("頁簽3").setIcon(android.R.drawable.ic_menu_agenda).setTabListener(new ActionTabListener(fragment3));actionBar.addTab(tab1);actionBar.addTab(tab2);actionBar.addTab(tab3);}class ActionTabListener implements ActionBar.TabListener {// 聲明Fragmentprivate Fragment fragment;// 通過構造引用相應的Fragmentpublic ActionTabListener(Fragment fragment) {this.fragment = fragment;}@Overridepublic void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {// TODO Auto-generated method stub}@Overridepublic void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {// TODO Auto-generated method stub// ft.add(android.R.id.content, fragment, null);mType = tab.getPosition();System.out.println("tab.getPosition():" + tab.getPosition());viewPager.setCurrentItem(tab.getPosition());invalidateOptionsMenu();}@Overridepublic void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {// TODO Auto-generated method stub}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.style1, menu);return true;}private int mType;@Overridepublic boolean onPrepareOptionsMenu(Menu menu) {// TODO Auto-generated method stubSystem.out.println("當前mType:" + mType);menu.clear();MenuInflater inflater = this.getMenuInflater();switch (mType) {case 0:inflater.inflate(R.menu.style1, menu);break;case 1:inflater.inflate(R.menu.style2, menu);break;case 2:inflater.inflate(R.menu.style3, menu);break;}return super.onPrepareOptionsMenu(menu);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// TODO Auto-generated method stubswitch (item.getItemId()) {case R.id.action_item1:Toast.makeText(this, "點擊了第一個button", Toast.LENGTH_SHORT).show();break;case R.id.action_item2:Toast.makeText(this, "點擊了第二個button", Toast.LENGTH_SHORT).show();break;case R.id.action_item3:Toast.makeText(this, "點擊了第三個button", Toast.LENGTH_SHORT).show();break;}return super.onOptionsItemSelected(item);}}
3. 須要注意的是MainActivity主邏輯中我的mType是一個標識量。用於標識當前Fragment然後切換。假設有疑問歡迎大家一起交流
本例的所有源碼點擊這裡,轉載請註明出處。謝謝!
Android編程心得-使用ActionBar+Fragment+ViewPager實現動態切換Menu效果