一、問題描述 |
在Android典型界面設計一文中,實現典型滑動導航界面,其實使用ActionBar 也可以輕松實現這一效果,甚至也可實現類似Android典型界面設計(3)的雙導航效果。可見ActionBar還是比較強大的,關鍵要深入進去、靈活的運用,下面我們就使用ActionBar實現如圖所示的效果:
二、本例特點 |
1、 兼容低版本
2、 使用ActionBar 分體設計(split)
3、 Tab使用自定義View
4、 結合ViewPager實現滑動導航
三、代碼講解: |
1、在項目中加入v7兼容包
要向下兼容需要在項目中加入v7兼容包的android-support-v7-appcompat,並創建MainActivity時,繼承 ActionBarActivity
public class MainActivity extends ActionBarActivity implements TabListener, OnPageChangeListener{ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initActionBar(); initViewPager(); } 。。。 }
在onCreeate方法中調用initActionBar和intViewPager,分別實現初始化ActionBar和初始化ViewPager。
2、initActionBar()代碼:初始化ActionBar
private void initActionBar(){ actionBar=super.getSupportActionBar(); actionBar.setDisplayShowHomeEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setIcon(R.drawable.sun); actionBar.setTitle(" 二手機"); //設置導航模式為Tabs方式 actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); //創建並配置Tab createTab(R.layout.nav, R.drawable.icon_home_weixiu_bg, "熱點設備"); createTab(R.layout.nav, R.drawable.icon_home_zzj_bg, "挖掘機"); createTab(R.layout.nav, R.drawable.icon_home_sharepro_bg, "裝載機"); }
createTab方法:
private void createTab(int layout,int imgId,String title){ View view=LayoutInflater.from(this).inflate(layout, null); ((TextView)view.findViewById(R.id.tvTitle)).setText(title); ((ImageView)view.findViewById(R.id.ivNav)).setImageResource(imgId); Tab tab=actionBar.newTab().setCustomView(view)//自定義View .setTabListener(this); actionBar.addTab(tab); }
nav.xml :tab的布局文件,實現ICON在Title上方的效果
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="2dp" > <ImageView android:id="@+id/ivNav" android:layout_width="20dp" android:layout_height="20dp" android:scaleType="centerInside" android:layout_alignParentTop="true" android:layout_centerHorizontal="true"/> <TextView android:id="@+id/tvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_below="@+id/ivNav" android:textColor="#fff"/> </RelativeLayout>
3、initViewPager方法
private String[] titles={"熱點設備","二手挖掘機","二手裝載機"}; private void initViewPager(){ mViewPager = (ViewPager)findViewById(R.id.vpList); fragList=new ArrayList<Fragment>(); Bundle bundle=null; Fragment frag=null; for(int i=0;i<titles.length;i++){ frag=new MachineFragment(); bundle=new Bundle(); bundle.putString("title",titles[i]); frag.setArguments(bundle); fragList.add(frag); } adapter=new MachinePagerAdapter(super.getSupportFragmentManager(), fragList); mViewPager.setAdapter(adapter); mViewPager.setOnPageChangeListener(this); }
MachinePagerAdapter適配器:
public class MachinePagerAdapter extends FragmentPagerAdapter { private List<Fragment> fragmentList; public MachinePagerAdapter(FragmentManager fm,List<Fragment> list) { super(fm); this.fragmentList=list; } public Fragment getItem(int arg0) { return fragmentList.get(arg0); } public int getCount() { return fragmentList.size(); } @Override public int getItemPosition(Object object) { return POSITION_NONE; //沒有找到child要求重新加載 } }
MachineFragment:可根據具體情況進行設計,這里僅顯示一個文本框
public class MachineFragment extends Fragment { private String title; public void setArguments(Bundle bundle) { title=bundle.getString("title");//接受傳入的參數 } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { TextView textView = new TextView(getActivity()); textView.setText(title);textView.setTextSize(20); textView.setTextColor(Color.RED);textView.setGravity(Gravity.CENTER); LinearLayout layout = new LinearLayout(getActivity()); LayoutParams params = new LayoutParams (LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); layout.setBackgroundColor(Color.WHITE); layout.addView(textView, params); return layout; } }
4、實現偵聽
implements OnPageChangeListener當View滑動時切換Tab public void onPageScrollStateChanged(int arg0) { } public void onPageScrolled(int arg0, float arg1, int arg2) { } public void onPageSelected(int idx) { actionBar.selectTab(actionBar.getTabAt(idx)); } implements TabListener當單擊tab時切換ViewPager public void onPageScrollStateChanged(int arg0) {} public void onPageScrolled(int arg0, float arg1, int arg2) {} public void onPageSelected(int idx) { actionBar.selectTab(actionBar.getTabAt(idx)); }
5、ActionBar Menu
main.xml菜單配置,使用xmlns:app="http://schemas.android.com/apk/res-auto"兼容低版本,並且使用app:showAsAction否則showAsAction將失效,即便設置為always菜單項還是出現在Overflow中
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_share" android:orderInCategory="100" app:showAsAction="always" android:title="分享" android:icon="@drawable/share_ico" /> <item android:id="@+id/action_common" android:orderInCategory="100" app:showAsAction="always" android:title="評論" android:icon="@drawable/com_btn" /> </menu>
產生選項菜單
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; }
響應單擊菜單
public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case R.id.action_share: Toast.makeText(this, "點擊了分享", Toast.LENGTH_LONG).show(); break; case R.id.action_common: Toast.makeText(this, "點擊了評論", Toast.LENGTH_LONG).show(); break; } return super.onOptionsItemSelected(item); }
6、實現ActionBar 的分體設計
讓菜單選項在底部排列顯示
在AndroidManifest.xml中給MainActivity添加android:uiOptions="splitActionBarWhenNarrow"屬性即可
四、ActionBar 樣式 |
如果兼容低版本Activity必須使用Theme.AppCompat主題樣式,可在這個主題基礎上定義ActionBar的樣式
<style name="Theme.MyActionBar" parent="@style/Theme.AppCompat.Light"> … </style>
Actionbar樣式比較多而且要考慮兼容性,比較麻煩,推薦通過Android Action Bar Style Generator可輕松生成
網址:http://jgilfelt.github.io/android-actionbarstylegenerator/
想要了解更多內容的小伙伴,可以點擊查看源碼,親自運行測試。
疑問咨詢或技術交流,請加入官方QQ群: (452379712)
出處: http://www.cnblogs.com/jerehedu/
本文版權歸煙台傑瑞教育科技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。