編輯:關於Android編程
2014的 google i/o發表令多數人為之一亮的 material design toolbar,這是用來取代過去 actionbar 的控件,而現在於 material design中也對之有一個統一名稱:app bar,在未來的 android app 中,就以 toolbar這個元件來實作之。概述 Android 3.0 Android推了 ActionBar這個控件,而到了2013年 Google開始大力地推動所謂的 android style,想要逐漸改善過去 android 紛亂的界面設計,希望讓終端使用者盡可能在 android手機有個一致的操作體驗。ActionBar過去最多人使用的兩大套件就是 ActionBarSherlock以及官方提供在 support library v 7裡的 AppCompat。 Toolbar的誕生,也意味著官方在某些程度上認為 ActionBar 限制了 android app的開發與設計的彈性,而在 material design也對之做了名稱的定義:App bar。
Material Design的Theme
@android:style/Theme.Material (dark version)@android:style/Theme.Material.Light (light version)@android:style/Theme.Material.Light.DarkActionBar與之對應的Compat Theme:
Theme.AppCompatTheme.AppCompat.LightTheme.AppCompat.Light.DarkActionBar示例:https://github.com/mengdd/HelloActivityAndFragmenthttps://github.com/hongyangAndroid/Android_Blog_Demos/tree/master/blogcodes/src/main/java/com/zhy/blogcodes/toolbarhttps://github.com/tekinarslan/AndroidMaterialDesignToolbarhttps://github.com/mosil/Android-Mosil-Sample-Toolbarhttps://github.com/hanks-zyh/ToolBar
1.首先項目gradle中添加:appcompat-v7依賴 2.確保Activity繼承AppCompatActivity 3.在application設置中使用NoActionBar的主題:
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
/>
4.把Toolbar寫在布局中
android:id="@+id/toolbar" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" android:layout_width="match_parent" android:background="?attr/colorPrimary" android:elevation="4dp" android:theme="@style/ThemeOverlay.AppCompat.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
請記得用 support v7裡的 toolbar,不然然只有 API Level 21也就是 Android 5.0以上的版本才能使用。程序 (Java)在 MainActivity.java中onCreate中加入 Toolbar的聲明:
Toolbar toolbar=(Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);//聲明後,再將之用 setSupportActionBar 設定,Toolbar即能取代原本的 actionbar 了
定義menu:
然後在代碼中inflate和處理它的點擊事件:
@Override publicboolean onCreateOptionsMenu(Menu menu){ Log.i(TAG, "onCreateOptionsMenu()"); getMenuInflater().inflate(R.menu.menu_activity_main, menu); returnsuper.onCreateOptionsMenu(menu); } @Override publicboolean onOptionsItemSelected(MenuItem item){ switch(item.getItemId()){ case R.id.action_android: Log.i(TAG, "action android selected"); returntrue; case R.id.action_favourite: Log.i(TAG, "action favourite selected"); returntrue; case R.id.action_settings: Log.i(TAG, "action settings selected"); returntrue; default: returnsuper.onOptionsItemSelected(item); } }
Menu Item,依然支持在menu/menu_main.xml去聲明,然後復寫onCreateOptionsMenu和onOptionsItemSelected即可。可選方案也可以通過toolbar.setOnMenuItemClickListener實現點擊MenuItem的回調。
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener(){ @Override publicboolean onMenuItemClick(MenuItem item){ returnfalse; } });
添加向上返回的action添加向上返回parent的action:
@Override protectedvoid onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_toolbar_demo); setSupportActionBar(toolbar); // add a left arrow to back to parent activity, // no need to handle action selected event, this is handled by super getSupportActionBar().setDisplayHomeAsUpEnabled(true); }
然後只需要在manifest中指定parent:
android:name=".toolbar.ToolbarDemoActivity" android:parentActivityName=".MainActivity"> android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity" />
可若是采用 toolbar的話,則要在界面 (layout)裡面設定 toolbar控件的background屬性。
navigationBarColor(導航欄底色):僅能在 API v21也就是 Android 5以後的版本中使用,因此要將之設定在 res/values-v21/styles.xml裡面。也因此在這個階段,我們需要設定的地方有三,一是 style中(res/values/styles.xml)
@color/accent_material_dark
@color/accent_material_light
@color/dim_foreground_material_dark
再來是 v21的style中 (res/values-v21/styles.xml)
@color/accent_material_light
最後,就是為了本篇的主角 – Toolbar的 background進行設定。
android:id="@+id/toolbar" android:layout_height="?attr/actionBarSize" android:layout_width="match_parent" android:background="?attr/colorPrimary">
在還未於 標簽中,自行添加元件的 toolbar有幾個大家常用的元素可以使用,請先見下圖:
Toolbar toolbar=(Toolbar) findViewById(R.id.toolbar); // App Logo toolbar.setLogo(R.drawable.ic_launcher); // Title toolbar.setTitle("My Title"); // Sub Title toolbar.setSubtitle("Sub title"); setSupportActionBar(toolbar); // Navigation Icon 要設定在 setSupoortActionBar之後才有作用 // 否則會出現 back button toolbar.setNavigationIcon(R.drawable.ab_android);
這邊要留意的是setNavigationIcon需要放在 setSupportActionBar之後才會生效。可選方案當然如果你喜歡,也可以在布局文件中去設置部分屬性:
android:id="@+id/id_toolbar" app:title="App Title" app:subtitle="Sub Title" app:navigationIcon="@drawable/ic_toc_white_24dp" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" android:layout_width="match_parent" android:background="?attr/colorPrimary"/>
Action Views and Action Providers To add an action view, create an
getActionView的正確操作方式:
@Override publicboolean onCreateOptionsMenu(Menu menu){ getMenuInflater().inflate(R.menu.main_activity_actions, menu); MenuItem searchItem= menu.findItem(R.id.action_search); SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); // Configure the search info and add any event listeners... returnsuper.onCreateOptionsMenu(menu); } Add an Action Provider
在這樣的架構設計下,ToolBar直接成了Layout中可以控制的東西,相對於過去的actionbar來說,設計與可操控性大幅提升。最後再附上一個界面上常用的屬性說明圖:這裡按照圖中從上到下的順序做個簡單的說明:
colorPrimaryDark
狀態欄背景色。在 style的屬性中設置。 textColorPrimary
App bar上的標題與更多菜單中的文字顏色。在 style的屬性中設置。 App bar的背景色
Actionbar的背景色設定在 style中的 colorPrimary。 Toolbar的背景色在layout文件中設置background屬性。 colorAccent
各控制元件(如:check box、switch或是 radoi)被勾選 (checked)或是選定 (selected)的顏色。在 style的屬性中設置。 colorControlNormal
各控制元件的預設顏色。在 style的屬性中設置 windowBackground
App 的背景色。在 style的屬性中設置 navigationBarColor
導航欄的背景色,但只能用在 API Level 21 (Android 5)以上的版本在 style的屬性中設置
最後需要注意的是:使用material主題的時候,必須設定targetSdkVersion = 21,否則界面看起來是模糊的
在Fragment中使用Toolbar的步驟和Activity差不多.在Fragment布局中添加一個Toolbar,然後find它,然後調用Activity的方法來把它設置成ActionBar:
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
注意此處有一個強轉,必須是AppCompatActivity才有這個方法.但是此時運行到Fragment之後,發現Toolbar上的文字和按鈕全是Activity傳過來的,這是因為只有Activity的onCreateOptionsMenu()被調用了,但是Fragment的並沒有被調用.在Fragment中加上這句:
setHasOptionsMenu(true);
此時Fragment的onCreateOptionsMenu()回調會被調到了,但是inflate出的按鈕和Activity中的actions加在一起顯示出來了.因為Activity的onCreateOptionsMenu()會在之前調用到.於是Fragment中的寫成這樣:
@Override publicvoid onCreateOptionsMenu(Menu menu, MenuInflater inflater){ Log.e(TAG, "onCreateOptionsMenu()"); menu.clear(); inflater.inflate(R.menu.menu_parent_fragment, menu); }
即先clear()一下,這樣按鈕就只有Fragment中設置的自己的了,不會有Activity中的按鈕.
前面已經介紹過, Fragment可以嵌套使用:Android Fragment使用(二)嵌套Fragments (Nested Fragments)的使用及常見錯誤那麼在前面的Fragment中再顯示一個子Fragment,並且又帶有一個不一樣的Toolbar,還需要哪些處理呢?首先, java代碼中還是需要有:
setHasOptionsMenu(true)
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
然後根據是否需要菜單按鈕,覆寫onCreateOptionsMenu()方法來inflate自己的menu文件即可.感覺和在普通的Fragment中使用Toolbar作為ActionBar並沒有什麼區別.但是如果你的多個Fragment有不同的Toolbar菜單選項,如果你沒有懂得其中的原理,可能就會出現一些混亂.下面來解說一下相關的方法.onCreateOptionsMenu()方法的調用一旦調用.setSupportActionBar(toolbar);就會導致Activity.onCreateOptionsMenu()方法的調用,而Activity會根據其中Fragment是否設置了setHasOptionsMenu(true)來調用Fragment的onCreateOptionsMenu()方法,調用順序是樹形的,按層級調用,中間如果有false則跳過.
假設當前Activity, Parent Fragment和Child Fragment中都設置了自己的Toolbar為ActionBar.在打開Child fragment的時候, onCreateOptionsMenu()的調用順序是.Activity → Parent → Child. 此時parent和child fragment都設置了setHasOptionsMenu(true).
關於這個,還有以下幾種情況: -如果Parent的`setHasOptionsMenu(false)`, Child為true,則Parent的`onCreateOptionsMenu()`不會調用,打開Child的時候Activity → Child. -如果Child的`setHasOptionsMenu(false)`, Parent為true,則打開Child的時候仍然會調用Activity和Parent的onCreateOptionsMenu()方法. - 如果Parent和Child都置為false,打開Parent和Child Fragment的時候都會調用Activity的onCreateOptionsMenu()方法.僅僅是child Fragment的show() hide()的切換, activity和parent Fragment的onCreateOptionsMenu()也會重新進入.
上面的機制常常是導致Toolbar上面的按鈕混淆錯亂的原因.舉個例子:如果我們現在Activity和Parent Fragment有不同的Toolbar按鈕,但是Child只有文字,沒有按鈕.很顯然我們不需要給child寫menu文件,也不需要覆寫child裡的onCreateOptionsMenu()方法.但是此時不管怎樣, parent的onCreateOptionsMenu()方法都會被調用,這樣我們打開child的時候, toolbar上就神奇地出現了parent裡的按鈕.這種情況如何解決呢?可以在parent中加一個條件,當沒有child fragment的時候才做inflate的工作:
@Override publicvoid onCreateOptionsMenu(Menu menu, MenuInflater inflater){ Log.e(TAG, "onCreateOptionsMenu()"); menu.clear(); if(getChildFragmentManager().getBackStackEntryCount()==0){ inflater.inflate(R.menu.menu_parent_fragment, menu); } }
另外,除了setSupportActionBar()之外,如果我們想主動觸發 onCreateOptionsMenu()方法的調用,可以用invalidateOptionsMenu()方法.
onOptionsItemSelected()方法的調用在Activity和其中的Fragment都有options menu的時候,需要注意menu item的id不要重復.因為點擊事件的分發也是從Activity開始分發下去的,如果child fragment中有個選項的id和Activity中一個選項的id重復了,則在Activity中就會將其處理,不會繼續分發.
有嵌套Fragment時 Back鍵處理之前沒有嵌套Fragment的情況下,只要將Fragment加入到Back Stack中,那麼按下Back鍵的時候pop動作是系統自動做好的.雖然在添加child fragment的時候將其加入到back stack中,但是按back鍵的時候仍然是將parent fragment彈出,只剩下Activity.這是因為back鍵只檢查第一層Fragment的back stack, 對於child fragment,需要在其parent中自己處理.比如這樣處理:在Activity中
@Override publicvoid onBackPressed(){ Fragment fragment = getSupportFragmentManager().findFragmentById(android.R.id.content); if(fragmentinstanceof ToolbarFragment){ if(((ToolbarFragment) fragment).onBackPressed()){ return; } } super.onBackPressed(); }
其中ToolbarFragment是直接加在Activity中作為parent fragment的.在parent fragment中(即ToolbarFragment中):
publicboolean onBackPressed(){
return getChildFragmentManager().popBackStackImmediate();
對於Fragment使用Toolbar思維被局限了,Menu的操作也不用在onCreateOptionsMenu方法,直接使用ToolBar的inflateMenu方法,Menu的事件也是獨立的,需要通過設置ToolBar的setOnMenuItemClickListener來實現。
Toolbar toolbar=(Toolbar) findViewById(R.id.toolbar); // App Logo toolbar.setLogo(R.drawable.ic_launcher); // Title toolbar.setTitle("My Title"); // Sub Title toolbar.setSubtitle("Sub title"); //setSupportActionBar(toolbar); toolbar.inflateMenu(R.menu.activity_main); // Navigation Icon 要設定在 setSupoortActionBar後 才有作用 // 否則會出現 back button toolbar.setNavigationIcon(R.drawable.ab_android); toolbar.setNavigationOnClickListener(newView.OnClickListener(){ @Override publicvoid onClick(View v){ } }); // Menu item click 設定在 setSupportActionBar 之後才有作用 toolbar.setOnMenuItemClickListener(onMenuItemClick); private Toolbar.OnMenuItemClickListener onMenuItemClick=new Toolbar.OnMenuItemClickListener(){ @Override publicboolean onMenuItemClick(MenuItem menuItem){ String msg=""; switch(menuItem.getItemId()){ case R.id.action_edit: break; } returntrue; } };
自定義布局 title修改為居中
xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@mipmap/bg_title" android:minHeight="?actionBarSize"> android:id="@+id/toolbar_title" style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"/>
禁用系統的title顯示,即setDisplayShowTitleEnabled方法實現將布局的內容延伸到狀態欄 styles.xml
大致思路整體實現還是比較容易的,首先需要引入DrawerLayout(如果你對DrawerLayout不了解,可以參考Android DrawerLayout 高仿QQ5.2雙向側滑菜單),然後去初始化mActionBarDrawerToggle,mActionBarDrawerToggle實際上是個DrawerListener,設置mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);就已經能夠實現上面點擊Nav Icon切換效果了。當然了細節還是挺多的。我們的效果圖,左側菜單為Fragment,內容區域為Fragment,點擊左側菜單切換內容區域的Fragment即可。 activity_main.xml
DrawerLayout中包含兩個FrameLayout,分別放內容區域和左側菜單的Fragment。 LeftMenuFragment
packagecom.zhy.toolbar; importandroid.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.ListFragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; /** * Created by zhy on 15/4/26. */ publicclass LeftMenuFragmentextends ListFragment { privatestaticfinalint SIZE_MENU_ITEM=3; privateMenuItem[] mItems=newMenuItem[SIZE_MENU_ITEM]; private LeftMenuAdapter mAdapter; private LayoutInflater mInflater; @Override publicvoid onCreate(@Nullable Bundle savedInstanceState){ super.onCreate(savedInstanceState); mInflater = LayoutInflater.from(getActivity()); MenuItem menuItem=null; for(int i =0; i< SIZE_MENU_ITEM; i++){ menuItem =newMenuItem(getResources().getStringArray(R.array.array_left_menu)[i],false, R.drawable.music_36px, R.drawable.music_36px_light); mItems[i]= menuItem; } } @Override publicView onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ returnsuper.onCreateView(inflater, container, savedInstanceState); } @Override publicvoid onViewCreated(View view, @Nullable Bundle savedInstanceState){ super.onViewCreated(view, savedInstanceState); setListAdapter(mAdapter =new LeftMenuAdapter(getActivity(), mItems)); } @Override publicvoid onListItemClick(ListView l, View v, int position,long id){ super.onListItemClick(l, v, position, id); if(mMenuItemSelectedListener!=null){ mMenuItemSelectedListener.menuItemSelected(((MenuItem) getListAdapter().getItem(position)).text); } mAdapter.setSelected(position); } //選擇回調的接口 publicinterface OnMenuItemSelectedListener{ void menuItemSelected(String title); } private OnMenuItemSelectedListener mMenuItemSelectedListener; publicvoid setOnMenuItemSelectedListener(OnMenuItemSelectedListener menuItemSelectedListener){ this.mMenuItemSelectedListener= menuItemSelectedListener; } }
繼承自ListFragment,主要用於展示各個Item,提供了一個選擇Item的回調,這個需要在Activity中去注冊處理。 LeftMenuAdapter
packagecom.zhy.toolbar; importandroid.content.Context; import android.graphics.Color; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; /** * Created by zhy on 15/4/26. */ publicclass LeftMenuAdapterextends ArrayAdapter{ private LayoutInflater mInflater; privateint mSelected; public LeftMenuAdapter(Context context,MenuItem[] objects){ super(context, -1, objects); mInflater = LayoutInflater.from(context); } @Override publicView getView(int position, View convertView, ViewGroup parent){ if(convertView==null){ convertView = mInflater.inflate(R.layout.item_left_menu, parent,false); } ImageView iv =(ImageView) convertView.findViewById(R.id.id_item_icon); TextView title =(TextView) convertView.findViewById(R.id.id_item_title); title.setText(getItem(position).text); iv.setImageResource(getItem(position).icon); convertView.setBackgroundColor(Color.TRANSPARENT); if(position== mSelected){ iv.setImageResource(getItem(position).iconSelected); convertView.setBackgroundColor(getContext().getResources().getColor(R.color.state_menu_item_selected)); } return convertView; } publicvoid setSelected(int position){ this.mSelected= position; notifyDataSetChanged(); } } packagecom.zhy.toolbar; publicclassMenuItem{ publicMenuItem(String text, boolean isSelected, int icon, int iconSelected){ this.text= text; this.isSelected= isSelected; this.icon= icon; this.iconSelected= iconSelected; } boolean isSelected; String text; int icon; int iconSelected; }
Adapter沒撒說的~~提供了一個setSection方法用於設置選中Item的樣式什麼的。接下來看ContentFragment,僅僅只是一個TextView而已,所以代碼也比較easy。
packagecom.zhy.toolbar; importandroid.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.text.TextUtils; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; /** * Created by zhy on 15/4/26. */ publicclass ContentFragmentextends Fragment { publicstaticfinalString KEY_TITLE ="key_title"; privateString mTitle; publicstatic ContentFragment newInstance(String title){ ContentFragment fragment =new ContentFragment(); Bundle bundle =new Bundle(); bundle.putString(KEY_TITLE, title); fragment.setArguments(bundle); return fragment; } @Nullable @Override publicView onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){ TextView tv =new TextView(getActivity()); String title=(String) getArguments().get(KEY_TITLE); if(!TextUtils.isEmpty(title)) { tv.setGravity(Gravity.CENTER); tv.setTextSize(40); tv.setText(title); } return tv; } }
提供newInstance接收一個title參數去實例化它。最後就是我們的MainActivity了,負責管理各種Fragment。
MainActivity packagecom.zhy.toolbar;importandroid.os.Bundle;importandroid.support.v4.app.Fragment;importandroid.support.v4.app.FragmentManager;importandroid.support.v4.app.FragmentTransaction;importandroid.support.v4.widget.DrawerLayout;importandroid.support.v7.app.ActionBarDrawerToggle;importandroid.support.v7.app.AppCompatActivity;importandroid.support.v7.widget.Toolbar;importandroid.text.TextUtils;importandroid.view.Gravity;importjava.util.List;publicclass MainActivity extends AppCompatActivity { private ActionBarDrawerToggle mActionBarDrawerToggle;private DrawerLayout mDrawerLayout;private Toolbar mToolbar;private LeftMenuFragment mLeftMenuFragment;private ContentFragment mCurrentFragment;privateString mTitle;privatestaticfinalString TAG ="com.zhy.toolbar";privatestaticfinalString KEY_TITLLE ="key_title"; @Override protectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initToolBar(); initViews();//恢復title restoreTitle(savedInstanceState); FragmentManager fm = getSupportFragmentManager();//查找當前顯示的Fragment mCurrentFragment =(ContentFragment) fm.findFragmentByTag(mTitle);if(mCurrentFragment==null){ mCurrentFragment = ContentFragment.newInstance(mTitle); fm.beginTransaction().add(R.id.id_content_container, mCurrentFragment, mTitle).commit(); } mLeftMenuFragment =(LeftMenuFragment) fm.findFragmentById(R.id.id_left_menu_container);if(mLeftMenuFragment==null){ mLeftMenuFragment =new LeftMenuFragment(); fm.beginTransaction().add(R.id.id_left_menu_container, mLeftMenuFragment).commit(); }//隱藏別的Fragment,如果存在的話 List fragments= fm.getFragments();if(fragments!=null)for(Fragment fragment: fragments){if(fragment== mCurrentFragment || fragment == mLeftMenuFragment)continue; fm.beginTransaction().hide(fragment).commit(); }//設置MenuItem的選擇回調 mLeftMenuFragment.setOnMenuItemSelectedListener(new LeftMenuFragment.OnMenuItemSelectedListener(){ @Override publicvoid menuItemSelected(String title){ FragmentManager fm = getSupportFragmentManager(); ContentFragment fragment =(ContentFragment) getSupportFragmentManager().findFragmentByTag(title);if(fragment== mCurrentFragment){ mDrawerLayout.closeDrawer(Gravity.LEFT);return; } FragmentTransaction transaction = fm.beginTransaction(); transaction.hide(mCurrentFragment);if(fragment==null){ fragment = ContentFragment.newInstance(title); transaction.add(R.id.id_content_container, fragment, title); }else{ transaction.show(fragment); } transaction.commit(); mCurrentFragment = fragment; mTitle = title; mToolbar.setTitle(mTitle); mDrawerLayout.closeDrawer(Gravity.LEFT); } }); }privatevoid restoreTitle(Bundle savedInstanceState){if(savedInstanceState!=null) mTitle = savedInstanceState.getString(KEY_TITLLE);if(TextUtils.isEmpty(mTitle)){ mTitle = getResources().getStringArray( R.array.array_left_menu)[0]; } mToolbar.setTitle(mTitle); } @Override protectedvoid onSaveInstanceState(Bundle outState){super.onSaveInstanceState(outState); outState.putString(KEY_TITLLE, mTitle); }privatevoid initToolBar(){ Toolbar toolbar = mToolbar =(Toolbar) findViewById(R.id.id_toolbar);// App Logo // toolbar.setLogo(R.mipmap.ic_launcher); // Title toolbar.setTitle(getResources().getStringArray(R.array.array_left_menu)[0]);// Sub Title // toolbar.setSubtitle("Sub title");// toolbar.setTitleTextAppearance(); setSupportActionBar(toolbar);//Navigation Icon toolbar.setNavigationIcon(R.drawable.ic_toc_white_24dp);/* toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { return false; } });*/ }privatevoid initViews(){ mDrawerLayout =(DrawerLayout) findViewById(R.id.id_drawerlayout); mActionBarDrawerToggle =new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.open, R.string.close); mActionBarDrawerToggle.syncState(); mDrawerLayout.setDrawerListener(mActionBarDrawerToggle); } }
內容區域的切換是通過Fragment hide和show實現的,畢竟如果用replace,如果Fragment的view結構比較復雜,可能會有卡頓。當然了,注意每個Fragment占據的內存情況,如果內存不足,可能需要改變實現方式。對於旋轉屏幕或者應用長時間置於後台,Activity重建的問題,做了簡單的處理。
下面寫怎麼讓每個首字母相同的聯系人歸類展示: 在adapter implement SectionIndexer 這樣adapter裡必須實現以下3個接口: @Ove
近期要做一個含有兩個tab切換頁面,兩個頁面有公共的描述信息區域,兩個tab都是listview,可以向上或向下拉動刷新,在頁面中部有一個tab切換區域,向上滑動的時候t
Line靜音自拍APP“B612”是一款自拍專用APP,專門用於自拍,且不會發出快門聲。該應用使用簡單,拍照之前無需像傳統拍照軟件那
一、漏洞分析今天我們來看一下Android中的屏幕錄制功能帶來的一個漏洞問題,在之前的一篇文章中介紹了關於Android5.0新增的Api來進行錄制屏幕視頻,不了解的同學