Action
BarÊÇÒ»ÖÖЉˆµÄµ¼º½À¸¹¦ÄÜ£¬ÔÚAndroid 3.0Ö®ºó¼ÓÈ뵽ϵͳµÄAPIµ±ÖУ¬Ëü±êʶÁËÓû§µ±Ç°²Ù×÷½çÃæµÄλÖ㬲¢ÌṩÁ˶îÍâµÄÓû§¶¯×÷¡¢½çÃæµ¼º½µÈ¹¦ÄÜ¡£Ê¹ÓÃActionBarµÄºÃ´¦ÊÇ£¬Ëü¿ÉÒÔ¸øÌṩһÖÖÈ«¾ÖͳһµÄUI½çÃæ£¬Ê¹µÃÓû§ÔÚʹÓÃÈκÎÒ»¿îÈí¼þʱ¶¼¶®µÃ¸ÃÈçºÎ²Ù×÷£¬²¢ÇÒActionBar»¹¿ÉÒÔ×Ô¶¯ÊÊÓ¦¸÷ÖÖ²»Í¬´óСµÄÆÁÄ»¡£ÏÂÃæÊÇÒ»ÕÅʹÓÃActionBarµÄ½çÃæ½ØÍ¼£º

ÆäÖУ¬[1]ÊÇActionBarµÄͼ±ê£¬[2]ÊÇÁ½¸öaction°´Å¥£¬[3]ÊÇoverflow°´Å¥¡£
ÓÉÓÚAction BarÊÇÔÚ3.0ÒÔºóµÄ°æ±¾ÖмÓÈëµÄ£¬Èç¹ûÏëÔÚ2.xµÄ°æ±¾ÀïʹÓÃActionBarµÄ»°ÔòÐèÒªÒýÈëSupport
Library£¬²»¹ý3.0֮ǰ°æ±¾µÄÊг¡Õ¼ÓÐÂÊÒѾ·Ç³£Ð¡ÁË£¬ÕâÀï¼òµ¥Æð¼ûÎÒÃǾͲ»ÔÙ¿¼ÂÇÈ¥×öÏòϼæÈÝ£¬¶øÊÇÖ»¿¼ÂÇ4.0ÒÔÉϰ汾µÄÓ÷¨¡£
Ìí¼ÓºÍÒÆ³ýAction Bar
ActionBarµÄÌí¼Ó·Ç³£¼òµ¥£¬Ö»ÐèÒªÔÚAndroidManifest.xmlÖÐÖ¸¶¨Application»òActivityµÄthemeÊÇTheme.Holo»òÆä×ÓÀà¾Í¿ÉÒÔÁË£¬¶øÊ¹ÓÃEclipse´´½¨µÄÏîÄ¿×Ô¶¯¾Í»á½«ApplicationµÄthemeÖ¸¶¨³ÉTheme.Holo£¬ËùÒÔActionBarĬÈ϶¼ÊÇÏÔʾ³öÀ´µÄ¡£Ð½¨Ò»¸ö¿ÕÏîÄ¿²¢ÔËÐУ¬Ð§¹ûÈçÏÂͼËùʾ£º

¶øÈç¹ûÏëÒªÒÆ³ýActionBarµÄ»°Í¨³£ÓÐÁ½ÖÖ·½Ê½£¬Ò»Êǽ«themeÖ¸¶¨³ÉTheme.Holo.NoActionBar£¬±íʾʹÓÃÒ»¸ö²»°üº¬ActionBarµÄÖ÷Ì⣬¶þÊÇÔÚActivityÖе÷ÓÃÒÔÏ·½·¨£º
ActionBar actionBar = getActionBar(); actionBar.hide(); |
ÏÖÔÚÖØÐÂÔËÐÐһϳÌÐò£¬¾Í¿ÉÒÔ¿´µ½ActionBar²»ÔÙÏÔʾÁË£¬ÈçÏÂͼËùʾ£º

ÐÞ¸ÄAction BarµÄͼ±êºÍ±êÌâ
ĬÈÏÇé¿öÏ£¬ÏµÍ³»áʹÓÃ<application>»òÕß<activity>ÖÐiconÊôÐÔÖ¸¶¨µÄͼƬÀ´×÷ΪActionBarµÄͼ±ê£¬µ«ÊÇÎÒÃÇÒ²¿ÉÒԸıäÕâһĬÈÏÐÐΪ¡£Èç¹ûÎÒÃÇÏëҪʹÓÃÁíÍâÒ»ÕÅͼƬÀ´×÷ΪActionBarµÄͼ±ê£¬¿ÉÒÔÔÚ<application>»òÕß<activity>ÖÐͨ¹ýlogoÊôÐÔÀ´½øÐÐÖ¸¶¨¡£±ÈÈçÏîÄ¿µÄres/drawableĿ¼ÏÂÓÐÒ»ÕÅweather.pngͼƬ£¬¾Í¿ÉÒÔÔÚAndroidManifest.xmlÖÐÕâÑùÖ¸¶¨£º
<activity android:name="com.example.actionbartest.MainActivity" android:logo="@drawable/weather" > </activity> |
ÏÖÔÚÖØÐÂÔËÐÐһϳÌÐò£¬Ð§¹ûÈçÏÂͼËùʾ£º

OK£¬ActionBarµÄͼ±êÒѾÐ޸ijɹ¦ÁË£¬ÄÇô±êÌâÖеÄÄÚÈݸÃÔõÑùÐÞ¸ÄÄØ£¿ÆäʵҲºÜ¼òµ¥£¬Ê¹ÓÃlabelÊôÐÔÀ´Ö¸¶¨Ò»¸ö×Ö·û´®¾Í¿ÉÒÔÁË£¬ÈçÏÂËùʾ£º
<activity android:name="com.example.actionbartest.MainActivity" android:label="ÌìÆø" android:logo="@drawable/weather" > </activity> |
ÏÖÔÚÖØÐÂÔËÐÐһϳÌÐò£¬½á¹ûÈçÏÂͼËùʾ£º

Ìí¼ÓAction°´Å¥
ActionBar»¹¿ÉÒÔ¸ù¾ÝÓ¦ÓóÌÐòµ±Ç°µÄ¹¦ÄÜÀ´ÌṩÓëÆäÏà¹ØµÄAction°´Å¥£¬ÕâЩ°´Å¥¶¼»áÒÔͼ±ê»òÎÄ×ÖµÄÐÎʽֱ½ÓÏÔʾÔÚActionBarÉÏ¡£µ±È»£¬Èç¹û°´Å¥¹ý¶à£¬ActionBarÉÏÏÔʾ²»Í꣬¶à³öµÄһЩ°´Å¥¿ÉÒÔÒþ²ØÔÚoverflowÀïÃæ£¨×îÓұߵÄÈý¸öµã¾ÍÊÇoverflow°´Å¥£©£¬µã»÷Ò»ÏÂoverflow°´Å¥¾Í¿ÉÒÔ¿´µ½È«²¿µÄAction°´Å¥ÁË¡£
µ±ActivityÆô¶¯µÄʱºò£¬ÏµÍ³»áµ÷ÓÃActivityµÄonCreateOptionsMenu()·½·¨À´È¡³öËùÓеÄAction°´Å¥£¬ÎÒÃÇÖ»ÐèÒªÔÚÕâ¸ö·½·¨ÖÐÈ¥¼ÓÔØÒ»¸ömenu×ÊÔ´£¬²¢°ÑËùÓеÄAction°´Å¥¶¼¶¨ÒåÔÚ×ÊÔ´ÎļþÀïÃæ¾Í¿ÉÒÔÁË¡£
ÄÇôÎÒÃÇÏÈÀ´¿´ÏÂmenu×ÊÔ´Îļþ¸ÃÈçºÎ¶¨Ò壬´úÂëÈçÏÂËùʾ£º
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.actionbartest.MainActivity" > <item android:id="@+id/action_compose" android:icon="@drawable/ic_action_compose" android:showAsAction="always" android:title="@string/action_compose"/> <item android:id="@+id/action_delete" android:icon="@drawable/ic_action_delete" android:showAsAction="always" android:title="@string/action_delete"/> <item android:id="@+id/action_settings" android:icon="@drawable/ic_launcher" android:showAsAction="never" android:title="@string/action_settings"/> </menu> |
¿ÉÒÔ¿´µ½£¬ÕâÀïÎÒÃÇͨ¹ýÈý¸ö<item>±êÇ©¶¨ÒåÁËÈý¸öAction°´Å¥¡£<item>±êÇ©ÖÐÓÖÓÐһЩÊôÐÔ£¬ÆäÖÐidÊǸÃAction°´Å¥µÄΨһ±êʶ·û£¬iconÓÃÓÚÖ¸¶¨¸Ã°´Å¥µÄͼ±ê£¬titleÓÃÓÚÖ¸¶¨¸Ã°´Å¥¿ÉÄÜÏÔʾµÄÎÄ×Ö£¨ÔÚͼ±êÄÜÏÔʾµÄÇé¿öÏ£¬Í¨³£²»»áÏÔʾÎÄ×Ö£©£¬showAsActionÔòÖ¸¶¨Á˸ð´Å¥ÏÔʾµÄλÖã¬Ö÷ÒªÓÐÒÔϼ¸ÖÖÖµ¿ÉÑ¡£ºalways±íʾÓÀÔ¶ÏÔʾÔÚActionBarÖУ¬Èç¹ûÆÁÄ»¿Õ¼ä²»¹»ÔòÎÞ·¨ÏÔʾ£¬ifRoom±íʾÆÁÄ»¿Õ¼ä¹»µÄÇé¿öÏÂÏÔʾÔÚActionBarÖУ¬²»¹»µÄ»°¾ÍÏÔʾÔÚoverflowÖУ¬neverÔò±íʾÓÀÔ¶ÏÔʾÔÚoverflowÖС£
½Ó×Å£¬ÖØÐ´ActivityµÄonCreateOptionsMenu()·½·¨£¬´úÂëÈçÏÂËùʾ£º
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); return super.onCreateOptionsMenu(menu); } |
Õⲿ·Ö´úÂëºÜ¼òµ¥£¬½ö½öÊǵ÷ÓÃÁËMenuInflaterµÄinflate()·½·¨À´¼ÓÔØmenu×ÊÔ´¾Í¿ÉÒÔÁË¡£ÏÖÔÚÖØÐÂÔËÐÐһϳÌÐò£¬½á¹ûÈçÏÂͼËùʾ£º

¿ÉÒÔ¿´µ½£¬action_composeºÍaction_deleteÕâÁ½¸ö°´Å¥ÒѾÔÚActionBarÖÐÏÔʾ³öÀ´ÁË£¬¶øaction_settingsÕâ¸ö°´Å¥ÓÉÓÚshowAsActionÊôÐÔÉèÖóÉÁËnever£¬ËùÒÔ±»Òþ²Øµ½ÁËoverflowµ±ÖУ¬Ö»Òªµã»÷Ò»ÏÂoverflow°´Å¥¾Í¿ÉÒÔ¿´µ½ËüÁË¡£
ÕâÀïÎÒÃÇ×¢Òâµ½£¬ÏÔʾÔÚActionBarÉϵİ´Å¥¶¼Ö»ÓÐÒ»¸öͼ±ê¶øÒÑ£¬ÎÒÃÇÔÚtitleÖÐÖ¸¶¨µÄÎÄ×Ö²¢Ã»ÓÐÏÔʾ³öÀ´¡£Ã»´í£¬titleÖеÄÄÚÈÝͨ³£Çé¿öÏÂÖ»»áÔÚoverflowÖÐÏÔʾ³öÀ´£¬ActionBarÖÐÓÉÓÚÆÁÄ»¿Õ¼äÓÐÏÞ£¬Ä¬ÈÏÊDz»»áÏÔʾtitleÄÚÈݵġ£µ«ÊdzöÓÚÒÔϼ¸ÖÖÒòËØ¿¼ÂÇ£¬¼´Ê¹titleÖеÄÄÚÈÝÎÞ·¨ÏÔʾ³öÀ´£¬ÎÒÃÇÒ²Ó¦¸Ã¸øÃ¿¸öitemÖж¼Ö¸¶¨Ò»¸ötitleÊôÐÔ£º
µ±ActionBarÖеÄÊ£Óà¿Õ¼ä²»×ãµÄʱºò£¬Èç¹ûAction°´Å¥Ö¸¶¨µÄshowAsActionÊôÐÔÊÇifRoomµÄ»°£¬¸ÃAction°´Å¥¾Í»á³öÏÖÔÚoverflowµ±ÖУ¬´Ëʱ¾ÍÖ»ÓÐtitleÄܹ»ÏÔʾÁË¡£
Èç¹ûAction°´Å¥ÔÚActionBarÖÐÏÔʾ£¬Óû§¿ÉÄÜͨ¹ý³¤°´¸ÃAction°´Å¥µÄ·½Ê½À´²é¿´µ½titleµÄÄÚÈÝ¡£
ÏìÓ¦Action°´Å¥µÄµã»÷ʼþ
µ±Óû§µã»÷Action°´Å¥µÄʱºò£¬ÏµÍ³»áµ÷ÓÃActivityµÄonOptionsItemSelected()·½·¨£¬Í¨¹ý·½·¨´«ÈëµÄMenuItem²ÎÊý£¬ÎÒÃÇ¿ÉÒÔµ÷ÓÃËüµÄgetItemId()·½·¨ºÍmenu×ÊÔ´ÖеÄid½øÐбȽϣ¬´Ó¶ø±æ±ð³öÓû§µã»÷µÄÊÇÄÄÒ»¸öAction°´Å¥£¬±ÈÈ磺
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_compose: Toast.makeText(this, "Compose", Toast.LENGTH_SHORT).show(); return true; case R.id.action_delete: Toast.makeText(this, "Delete", Toast.LENGTH_SHORT).show(); return true; case R.id.action_settings: Toast.makeText(this, "Settings", Toast.LENGTH_SHORT).show(); return true; default: return super.onOptionsItemSelected(item); } } |
¿ÉÒÔ¿´µ½£¬ÎÒÃÇÈÃÿ¸öAction°´Å¥±»µã»÷µÄʱºò¶¼µ¯³öÒ»¸öToast£¬ÏÖÔÚÖØÐÂÔËÐÐһϴúÂ룬½á¹ûÈçÏÂͼËùʾ£º

ͨ¹ýAction Barͼ±ê½øÐе¼º½
ÆôÓÃActionBarͼ±êµ¼º½µÄ¹¦ÄÜ£¬¿ÉÒÔÔÊÐíÓû§¸ù¾Ýµ±Ç°Ó¦ÓõÄλÖÃÀ´ÔÚ²»Í¬½çÃæÖ®¼äÇл»¡£±ÈÈ磬A½çÃæÕ¹Ê¾ÁËÒ»¸öÁÐ±í£¬µã»÷ijһÏîÖ®ºó½øÈëÁËB½çÃæ£¬ÕâʱB½çÃæ¾ÍÓ¦¸ÃÆôÓÃActionBarͼ±êµ¼º½¹¦ÄÜ£¬ÕâÑù¾Í¿ÉÒԻص½A½çÃæ¡£
ÎÒÃÇ¿ÉÒÔͨ¹ýµ÷ÓÃsetDisplayHomeAsUpEnabled()·½·¨À´ÆôÓÃActionBarͼ±êµ¼º½¹¦ÄÜ£¬±ÈÈ磺
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle("ÌìÆø"); setContentView(R.layout.activity_main); ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); } |
ÏÖÔÚÖØÐÂÔËÐÐһϳÌÐò£¬½á¹ûÈçÏÂͼËùʾ£º

¿ÉÒÔ¿´µ½£¬ÔÚActionBarͼ±êµÄ×ó²à³öÏÖÁËÒ»¸öÏò×óµÄ¼ýÍ·£¬Í¨³£Çé¿öÏÂÕâ¶¼±íʾ·µ»ØµÄÒâ˼£¬Òò´Ë×î¼òµ¥µÄʵÏÖ¾ÍÊÇÔÚËüµÄµã»÷ʼþÀïÃæ¼ÓÈëfinish()·½·¨¾Í¿ÉÒÔÁË£¬ÈçÏÂËùʾ£º
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; ¡¡ } } |
µ±µã»÷ActionBarͼ±êµÄʱºò£¬ÏµÍ³Í¬Ñù»áµ÷ÓÃonOptionsItemSelected()·½·¨£¬²¢ÇÒ´ËʱµÄitemIdÊÇandroid.R.id.home£¬ËùÒÔfinish()·½·¨Ò²¾ÍÊǼÓÔÚÕâÀïµÄÁË¡£
ÏÖÔÚ¿´ÉÏÈ¥£¬ActionBarµ¼º½ºÍBack¼üµÄ¹¦ÄÜÃ²ËÆÊÇÒ»ÑùµÄ¡£Ã»´í£¬Èç¹ûÎÒÃÇÖ»ÊǼòµ¥µØfinishÁËһϣ¬ActionBarµ¼º½ºÍBack¼üµÄ¹¦ÄÜÊÇÍêȫһÑùµÄ£¬µ«ActionBarµ¼º½µÄÉè¼Æ³õÖÔ²¢²»ÊÇÕâÑùµÄ£¬ËüºÍBack¼üµÄ¹¦ÄÜ»¹ÊÇÓÐÒ»Ð©Çø±ðµÄ£¬¾Ù¸öÀý×Ó°É¡£

ÉÏͼÖеÄConversation ListÊÇÊÕ¼þÏäµÄÖ÷½çÃæ£¬ÏÖÔÚÎÒÃǵã»÷µÚÒ»·âÓʼþ»á½øÈëµ½Conversation1
details½çÃæ£¬È»ºóµã»÷ÏÂÒ»·âÓʼþ»á½øÈëµ½Conversation 2 details½çÃæ£¬ÔÙµã»÷ÏÂÒ»·âÓÊÏä»á½øÈëµ½Conversation3
details½çÃæ¡£ºÃµÄ£¬Õâ¸öʱºòÈç¹ûÎÒÃǰ´ÏÂBack¼ü£¬Ó¦¸Ã»á»Øµ½Conversation 2 details½çÃæ£¬ÔÙ°´Ò»´ÎBack¼üÓ¦¸Ã»Øµ½Conversation1
details½çÃæ£¬ÔÙ°´Ò»´ÎBack¼ü²Å»á»Øµ½Conversation List¡£¶øActionBarµ¼º½Ôò²»Ó¦¸Ã±íÏÖ³öÕâÖÖÐÐΪ£¬ÎÞÂÛÎÒÃǵ±Ç°ÔÚÄÄÒ»¸öConversation
details½çÃæ£¬µã»÷һϵ¼º½°´Å¥¶¼Ó¦¸Ã»Øµ½Conversation List½çÃæ²Å¶Ô¡£
Õâ¾ÍÊÇActionBarµ¼º½ºÍBack¼üÔÚÉè¼ÆÉϵÄÇø±ð£¬ÄÇô¸ÃÔõÑù²ÅÄÜʵÏÖÕâÑùµÄ¹¦ÄÜÄØ£¿Æäʵ²¢²»¸´ÔÓ£¬ÊµÏÖ±ê×¼µÄActionBarµ¼º½¹¦ÄÜÖ»ÐèÈý²½×ß¡£
µÚÒ»²½ÎÒÃÇÒѾʵÏÖÁË£¬¾ÍÊǵ÷ÓÃsetDisplayHomeAsUpEnabled()·½·¨£¬²¢´«Èëtrue¡£
µÚ¶þ²½ÐèÒªÔÚAndroidManifest.xmlÖÐÅäÖø¸Activity£¬ÈçÏÂËùʾ£º
<activity android:name="com.example.actionbartest.MainActivity" android:logo="@drawable/weather" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.actionbartest.LaunchActivity" /> </activity> |
¿ÉÒÔ¿´µ½£¬ÕâÀïͨ¹ýmeta-data±êǩָ¶¨ÁËMainActivityµÄ¸¸ActivityÊÇLaunchActivity£¬ÔÚAndroid
4.1°æ±¾Ö®ºó£¬Ò²¿ÉÒÔÖ±½ÓʹÓÃandroid:parentActivityNameÕâ¸öÊôÐÔÀ´½øÐÐÖ¸¶¨£¬ÈçÏÂËùʾ£º
<activity android:name="com.example.actionbartest.MainActivity" android:logo="@drawable/weather" android:parentActivityName="com.example.actionbartest.LaunchActivity" > </activity> |
µÚÈý²½ÔòÐèÒª¶Ôandroid.R.id.homeÕâ¸öʼþ½øÐÐÒ»Ð©ÌØÊâ´¦Àí£¬ÈçÏÂËùʾ£º
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Intent upIntent = NavUtils.getParentActivityIntent(this); if (NavUtils.shouldUpRecreateTask(this, upIntent)) { TaskStackBuilder.create(this) .addNextIntentWithParentStack(upIntent) .startActivities(); } else { upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); NavUtils.navigateUpTo(this, upIntent); } return true; ...... } } |
ÆäÖУ¬µ÷ÓÃNavUtils.getParentActivityIntent()·½·¨¿ÉÒÔ»ñÈ¡µ½Ìø×ªÖÁ¸¸ActivityµÄIntent£¬È»ºóÈç¹û¸¸ActivityºÍµ±Ç°ActivityÊÇÔÚͬһ¸öTaskÖеģ¬ÔòÖ±½Óµ÷ÓÃnavigateUpTo()·½·¨½øÐÐÌø×ª£¬Èç¹û²»ÊÇÔÚͬһ¸öTaskÖеģ¬ÔòÐèÒª½èÖúTaskStackBuilderÀ´´´½¨Ò»¸öеÄTask¡£
ÕâÑù£¬¾Í°´ÕÕ±ê×¼µÄ¹æ·¶³É¹¦ÊµÏÖActionBarµ¼º½µÄ¹¦ÄÜÁË¡£
Ìí¼ÓAction View
ActionViewÊÇÒ»ÖÖ¿ÉÒÔÔÚActionBarÖÐÌæ»»Action°´Å¥µÄ¿Ø¼þ£¬Ëü¿ÉÒÔÔÊÐíÓû§ÔÚ²»Çл»½çÃæµÄÇé¿öÏÂͨ¹ýActionBarÍê³ÉһЩ½ÏΪ·á¸»µÄ²Ù×÷¡£±ÈÈç˵£¬ÄãÐèÒªÍê³ÉÒ»¸öËÑË÷¹¦ÄÜ£¬¾Í¿ÉÒÔ½«SeachViewÕâ¸ö¿Ø¼þÌí¼Óµ½ActionBarÖС£
ΪÁËÉùÃ÷Ò»¸öActionView£¬ÎÒÃÇ¿ÉÒÔÔÚmenu×ÊÔ´ÖÐͨ¹ýactionViewClassÊôÐÔÀ´Ö¸¶¨Ò»¸ö¿Ø¼þ£¬ÀýÈç¿ÉÒÔʹÓÃÈçÏ·½Ê½Ìí¼ÓSearchView£º
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_search" android:icon="@drawable/ic_action_search" android:actionViewClass="android.widget.SearchView" android:showAsAction="ifRoom|collapseActionView" android:title="@string/action_search" /> ...... </menu> |
×¢ÒâÔÚshowAsActionÊôÐÔÖÐÎÒÃÇ»¹ÉùÃ÷ÁËÒ»¸öcollapseActionView£¬Õâ¸öÖµ±íʾ¸Ã¿Ø¼þ¿ÉÒÔ±»ºÏ²¢³ÉÒ»¸öAction°´Å¥¡£
ÏÖÔÚÖØÐÂÔËÐÐһϳÌÐò£¬Ð§¹ûÈçÏÂͼËùʾ£º

OK£¬¹ûÈ»ÓÐÒ»¸öËÑË÷ÑùʽµÄAction°´Å¥³öÏÖÁË£¬ÏÖÔÚµã»÷Ò»ÏÂÕâ¸öËÑË÷°´Å¥£¬Ð§¹ûÈçÏÂͼËùʾ£º

¿ÉÒÔ¿´µ½£¬ÕâʱSearchView¾Í»áÕ¹¿ªÕ¼ÂúÕû¸öActionBar£¬¶øÆäËüµÄAction°´Å¥ÓÉÓÚ½«showAsActionÊôÐÔÉèÖóÉÁËifRoom£¬´Ëʱ¶¼»áÒþ²Øµ½overflowµ±ÖС£
Èç¹ûÄ㻹ϣÍûÔÚ´úÂëÖжÔSearchViewµÄÊôÐÔ½øÐÐÅäÖ㨱ÈÈçÌí¼Ó¼àÌýʼþµÈ£©£¬ÍêȫûÓÐÎÊÌ⣬ֻÐèÒªÔÚonCreateOptionsMenu()·½·¨ÖлñÈ¡¸ÃActionViewµÄʵÀý¾Í¿ÉÒÔÁË£¬´úÂëÈçÏÂËùʾ£º
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); MenuItem searchItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) searchItem.getActionView(); // ÅäÖÃSearchViewµÄÊôÐÔ ...... return super.onCreateOptionsMenu(menu); } |
Ôڵõ½ÁËSearchViewµÄʵÀýÖ®ºó£¬¾Í¿ÉÒÔÈÎÒâµØÅäÖÃËüµÄ¸÷ÖÖÊôÐÔÁË¡£¹ØÓÚSearchViewµÄ¸ü¶àÏêϸÓ÷¨£¬¿ÉÒԲο¼¹Ù·½Îĵµ
http://developer.android.com/guide/topics/search/search-dialog.html
¡£
³ý´ËÖ®Í⣬ÓÐЩ³ÌÐò¿ÉÄÜ»¹Ï£ÍûÔÚActionViewÕ¹¿ªºÍºÏ²¢µÄʱºòÏÔʾ²»Í¬µÄ½çÃæ£¬ÆäʵÎÒÃÇÖ»ÐèҪȥע²áÒ»¸öActionViewµÄ¼àÌýÆ÷¾ÍÄÜʵÏÖÕâÑùµÄ¹¦ÄÜÁË£¬´úÂëÈçÏÂËùʾ£º
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); MenuItem searchItem = menu.findItem(R.id.action_search); searchItem.setOnActionExpandListener(new OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { Log.d("TAG", "on expand"); return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { Log.d("TAG", "on collapse"); return true; } }); return super.onCreateOptionsMenu(menu); } |
¿ÉÒÔ¿´µ½£¬µ÷ÓÃMenuItemµÄsetOnActionExpandListener()·½·¨¾Í¿ÉÒÔ×¢²áÒ»¸ö¼àÌýÆ÷ÁË£¬µ±SearchViewÕ¹¿ªµÄʱºò¾Í»á»Øµ÷onMenuItemActionExpand()·½·¨£¬µ±SearchViewºÏ²¢µÄʱºò¾Í»áµ÷ÓÃonMenuItemActionCollapse()·½·¨£¬ÎÒÃÇÔÚÕâÁ½¸ö·½·¨ÖнøÐÐÏàÓ¦µÄUI²Ù×÷¾Í¿ÉÒÔÁË¡£
Overflow°´Å¥²»ÏÔʾµÄÇé¿ö
ËäÈ»ÏÖÔÚÎÒÃÇÒÑ¾ÕÆÎÕÁ˲»ÉÙActionBarµÄÓ÷¨£¬µ«Êǵ±ÄãÕæÕýȥʹÓÃËüµÄʱºò»¹ÊÇ¿ÉÄÜ»áÓöµ½¸÷ÖÖ¸÷ÑùµÄÎÊÌ⣬±ÈÈçºÜ¶àÈ˶¼»áÅöµ½overflow°´Å¥²»ÏÔʾµÄÇé¿ö¡£Ã÷Ã÷ÊÇͬÑùµÄÒ»·Ý´úÂ룬overflow°´Å¥ÔÚÓÐЩÊÖ»úÉÏ»áÏÔʾ£¬¶øÔÚÓÐЩÊÖ»úÉÏÆ«Æ«¾Í²»ÏÔʾ£¬ÕâÊÇÎªÊ²Ã´ÄØ£¿ºóÀ´ÎÒ×ܽáÁËһϣ¬overflow°´Å¥µÄÏÔʾÇé¿öºÍÊÖ»úµÄÓ²¼þÇé¿öÊÇÓйØÏµµÄ£¬Èç¹ûÊÖ»úûÓÐÎïÀíMenu¼üµÄ»°£¬overflow°´Å¥¾Í¿ÉÒÔÏÔʾ£¬Èç¹ûÓÐÎïÀíMenu¼üµÄ»°£¬overflow°´Å¥¾Í²»»áÏÔʾ³öÀ´¡£±ÈÈçÎÒÃÇÆô¶¯Ò»¸öÓÐMenu¼üµÄÄ£ÄâÆ÷£¬È»ºó½«´úÂëÔËÐе½¸ÃÄ£ÄâÆ÷ÉÏ£¬½á¹ûÈçÏÂͼËùʾ£º

¿ÉÒÔ¿´µ½£¬ActionBar×îÓұߵÄoverflow°´Å¥²»¼ûÁË£¡ÄÇô´ËʱÎÒÃÇÈçºÎ²é¿´Òþ²ØÔÚoverflowÖеÄAction°´Å¥ÄØ£¿Æäʵ·Ç³£¼òµ¥£¬°´Ò»ÏÂMenu¼ü£¬Òþ²ØµÄÄÚÈݾͻá´Óµ×²¿³öÀ´ÁË£¬ÈçÏÂͼËùʾ£º

¿´µ½ÕâÀïÏàÐŲ»ÉÙÅóÓѶ¼ÏëͲÛÒ»ÏÂÁË£¬ÕâÏÔÈ»ÊÇÒ»Öַdz£µ°ÌÛµÄÉè¼Æ£¬ÔÚ²»Í¬ÊÖ»úÉϾ¹È»ÏÔʾÁ˲»Í¬µÄ½çÃæ£¬¶øÇÒ²Ù×÷·½·¨Ò²ÍêÈ«²»Ò»Ñù£¬ÕâÑù»á¸øÓû§Ò»Öַdz£²»Ï°¹ßµÄ¸Ð¾õ¡£»°ËµGoogleΪʲôҪ°ÑActionBarµÄoverflowÉè¼Æ³ÉÕâÑùÎÒÒ²²»Ì«Àí½â£¬µ«ÊÇÎÒÃÇ»¹ÊÇÓа취¸Ä±äÕâһĬÈÏÐÐΪµÄ¡£
ʵ¼ÊÉÏ£¬ÔÚViewConfigurationÕâ¸öÀàÖÐÓÐÒ»¸ö½Ð×ösHasPermanentMenuKeyµÄ¾²Ì¬±äÁ¿£¬ÏµÍ³¾ÍÊǸù¾ÝÕâ¸ö±äÁ¿µÄÖµÀ´ÅжÏÊÖ»úÓÐûÓÐÎïÀíMenu¼üµÄ¡£µ±È»ÕâÊÇÒ»¸öÄÚ²¿±äÁ¿£¬ÎÒÃÇÎÞ·¨Ö±½Ó·ÃÎÊËü£¬µ«ÊÇ¿ÉÒÔͨ¹ý·´ÉäµÄ·½Ê½ÐÞ¸ÄËüµÄÖµ£¬ÈÃËüÓÀԶΪfalse¾Í¿ÉÒÔÁË£¬´úÂëÈçÏÂËùʾ£º
@Override protected void onCreate(Bundle savedInstanceState) { ...... setOverflowShowingAlways(); } private void setOverflowShowingAlways() { try { ViewConfiguration config = ViewConfiguration.get(this); Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false); } catch (Exception e) { e.printStackTrace(); } } |
ÕâÀïÎÒÃÇÔÚonCreate()·½·¨µÄ×îºóµ÷ÓÃÁËsetOverflowShowingAlways()·½·¨£¬¶øÕâ¸ö·½·¨µÄÄÚ²¿¾ÍÊÇʹÓ÷´ÉäµÄ·½Ê½½«sHasPermanentMenuKeyµÄÖµÉèÖóÉfalse£¬ÏÖÔÚÖØÐÂÔËÐÐһϴúÂ룬½á¹ûÈçÏÂͼËùʾ£º

¿ÉÒÔ¿´µ½£¬¼´Ê¹ÊÇÔÚÓÐMenu¼üµÄÊÖ»úÉÏ£¬Ò²ÄÜÈÃoverflow°´Å¥ÏÔʾ³öÀ´ÁË£¬ÕâÑù¾Í¿ÉÒÔ´ó´óÔö¼ÓÎÒÃÇÈí¼þ½çÃæºÍ²Ù×÷µÄͳһÐÔ¡£
ÈÃOverflowÖеÄÑ¡ÏîÏÔʾͼ±ê
Èç¹ûÄãµã»÷Ò»ÏÂoverflow°´Å¥È¥²é¿´Òþ²ØµÄAction°´Å¥£¬Äã»á·¢ÏÖÕⲿ·ÖAction°´Å¥¶¼ÊÇÖ»ÏÔʾÎÄ×Ö²»ÏÔʾͼ±êµÄ£¬ÈçÏÂͼËùʾ£º

ÕâÊǹٷ½µÄĬÈÏЧ¹û£¬GoogleÈÏΪÒþ²ØÔÚoverflowÖеÄAction°´Å¥¶¼Ó¦¸ÃÖ»ÏÔʾÎÄ×Ö¡£µ±È»£¬Èç¹ûÄãÈÏΪÕâÑù²»¹»ÃÀ¹Û£¬Ï£ÍûÔÚoverflowÖеÄAction°´Å¥Ò²¿ÉÒÔÏÔʾͼ±ê£¬ÎÒÃÇÈÔÈ»¿ÉÒÔÏë°ì·¨À´¸Ä±äÕâһĬÈÏÐÐΪ¡£
Æäʵ£¬overflowÖеÄAction°´Å¥Ó¦²»Ó¦¸ÃÏÔʾͼ±ê£¬ÊÇÓÉMenuBuilderÕâ¸öÀàµÄsetOptionalIconsVisible·½·¨À´¾ö¶¨µÄ£¬Èç¹ûÎÒÃÇÔÚoverflow±»Õ¹¿ªµÄʱºò¸øÕâ¸ö·½·¨´«Èëtrue£¬ÄÇôÀïÃæµÄÿһ¸öAction°´Å¥¶ÔÓ¦µÄͼ±ê¾Í¶¼»áÏÔʾ³öÀ´ÁË¡£µ÷Óõķ½·¨µ±È»ÈÔÈ»ÊÇÓ÷´ÉäÁË£¬´úÂëÈçÏÂËùʾ£º
@Override public boolean onMenuOpened(int featureId, Menu menu) { if (featureId == Window.FEATURE_ACTION_BAR && menu != null) { if (menu.getClass().getSimpleName().equals("MenuBuilder")) { try { Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE); m.setAccessible(true); m.invoke(menu, true); } catch (Exception e) { } } } return super.onMenuOpened(featureId, menu); } |
¿ÉÒÔ¿´µ½£¬ÕâÀïÎÒÃÇÖØÐ´ÁËÒ»¸öonMenuOpened()·½·¨£¬µ±overflow±»Õ¹¿ªµÄʱºò¾Í»á»Øµ÷Õâ¸ö·½·¨£¬½Ó×ÅÔÚÕâ¸ö·½·¨µÄÄÚ²¿Í¨¹ý·µ»Ø·´ÉäµÄ·½·¨½«MenuBuilderµÄsetOptionalIconsVisible±äÁ¿ÉèÖÃΪtrue¾Í¿ÉÒÔÁË¡£
ÏÖÔÚÖØÐÂÔËÐÐһϴúÂ룬½á¹ûÈçÏÂͼËùʾ£º

ºÃÁË£¬Ä¿Ç°ÎªÖ¹ÎÒÃÇÒѾ°ÑActionBarµÄ»ù´¡ÖªÊ¶½éÉÜÍêÁË£¬ÄÇô½ñÌìµÄ½²½â¾Íµ½ÕâÀÏÂÆªÎÄÕÂÖÐÎÒ»á´øÁì´ó¼ÒÒ»Æð¸üÉîÈëµØÁ˽âActionBar¡£
Ìí¼ÓAction Provider
ºÍAction ViewÓеãÀàËÆ£¬Action ProviderÒ²¿ÉÒÔ½«Ò»¸öAction°´Å¥Ìæ»»³ÉÒ»¸ö×Ô¶¨ÒåµÄ²¼¾Ö¡£µ«²»Í¬µÄÊÇ£¬Action
ProviderÄܹ»ÍêÈ«¿ØÖÆÊ¼þµÄËùÓÐÐÐΪ£¬²¢ÇÒ»¹¿ÉÒÔÔÚµã»÷µÄʱºòÏÔʾ×Ӳ˵¥¡£
ΪÁËÌí¼ÓÒ»¸öAction Provider£¬ÎÒÃÇÐèÒªÔÚ<item>±êÇ©ÖÐÖ¸¶¨Ò»¸öactionViewClassÊôÐÔ£¬ÔÚÀïÃæÌîÈëAction
ProviderµÄÍêÕûÀàÃû¡£ÎÒÃÇ¿ÉÒÔͨ¹ý¼Ì³ÐActionProviderÀàµÄ·½Ê½À´´´½¨Ò»¸ö×Ô¼ºµÄAction
Provider£¬Í¬Ê±£¬AndroidÒ²ÌṩºÃÁ˼¸¸öÄÚÖõÄAction Provider£¬±ÈÈç˵ShareActionProvider¡£
ÓÉÓÚÿ¸öAction Provider¶¼¿ÉÒÔ×ÔÓɵؿØÖÆÊ¼þÏìÓ¦£¬ËùÒÔËüÃDz»ÐèÒªÔÚonOptionsItemSelected()·½·¨ÖÐÔÙÈ¥¼àÌýµã»÷ʼþ£¬¶øÊÇÓ¦¸ÃÔÚonPerformDefaultAction()·½·¨ÖÐÈ¥Ö´ÐÐÏàÓ¦µÄÂß¼¡£
ÄÇôÎÒÃǾÍÏÈÀ´¿´Ò»ÏÂShareActionProviderµÄ¼òµ¥Ó÷¨°É£¬±à¼menu×ÊÔ´Îļþ£¬ÔÚÀïÃæ¼ÓÈëShareActionProviderµÄÉùÃ÷£¬ÈçÏÂËùʾ£º
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.actionbartest.MainActivity" > <item android:id="@+id/action_share" android:actionProviderClass="android.widget.ShareActionProvider" android:showAsAction="ifRoom" android:title="@string/action_share" /> ...... </menu> |
×¢Ò⣬ShareActionProvider»á×Ô¼º´¦ÀíËüµÄÏÔʾºÍʼþ£¬µ«ÎÒÃÇÈÔȻҪ¼ÇµÃ¸øËüÌí¼ÓÒ»¸ötitle£¬ÒÔ·ÀÖ¹Ëü»áÔÚoverflowµ±ÖгöÏÖ¡£
½Ó×ÅʣϵÄÊÂÇé¾ÍÊÇͨ¹ýIntentÀ´¶¨Òå³öÄãÏë·ÖÏíÄÄЩ¶«Î÷ÁË£¬ÎÒÃÇÖ»ÐèÒªÔÚonCreateOptionsMenu()Öе÷ÓÃMenuItemµÄgetActionProvider()·½·¨À´µÃµ½¸ÃShareActionProvider¶ÔÏó£¬ÔÙͨ¹ýsetShareIntent()·½·¨È¥Ñ¡Ôñ¹¹½¨³öʲôÑùµÄÒ»¸öIntent¾Í¿ÉÒÔÁË¡£´úÂëÈçÏÂËùʾ£º
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); MenuItem shareItem = menu.findItem(R.id.action_share); ShareActionProvider provider = (ShareActionProvider) shareItem.getActionProvider(); provider.setShareIntent(getDefaultIntent()); ...... return super.onCreateOptionsMenu(menu); } private Intent getDefaultIntent() { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("image/*"); return intent; } |
¿ÉÒÔ¿´µ½£¬ÕâÀïÎÒÃÇͨ¹ýgetDefaultIntent()·½·¨À´¹¹½¨ÁËÒ»¸öIntent£¬¸ÃIntent±íʾ»á½«ËùÓпÉÒÔ¹²ÏíͼƬµÄ³Ì¶È¶¼ÁгöÀ´¡£ÖØÐÂÔËÐÐһϳÌÐò£¬Ð§¹ûÈçÏÂͼËùʾ£º

ϸÐĵÄÄãÒ»¶¨¹Û²ìµ½ÁË£¬Õâ¸öShareActionProviderµã»÷Ö®ºóÊÇ¿ÉÒÔÕ¹¿ªµÄ£¬ÓеãÀàËÆÓÚoverflowµÄЧ¹û£¬Õâ¾ÍÊÇAction
ProviderµÄ×Ӳ˵¥¡£³ýÁËʹÓÃShareActionProviderÖ®Í⣬ÎÒÃÇÒ²¿ÉÒÔ×Ô¶¨ÒåÒ»¸öAction
Provider£¬±ÈÈç˵Èç¹ûÏëÒª½¨Á¢Ò»¸öÓµÓÐÁ½Ïî×Ӳ˵¥µÄAction Provider£¬¾Í¿ÉÒÔÕâÑùд£º
public class MyActionProvider extends ActionProvider { public MyActionProvider(Context context) { super(context); } @Override public View onCreateActionView() { return null; } @Override public void onPrepareSubMenu(SubMenu subMenu) { subMenu.clear(); subMenu.add("sub item 1").setIcon(R.drawable.ic_launcher) .setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { return true; } }); subMenu.add("sub item 2").setIcon(R.drawable.ic_launcher) .setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { return false; } }); } @Override public boolean hasSubMenu() { return true; } } |
ÕâÀïÎÒÃÇн¨ÁËÒ»¸öMyActionProvider¼Ì³Ð×ÔActionProvider£¬ÎªÁ˱íʾÕâ¸öAction
ProviderÊÇÓÐ×Ӳ˵¥µÄ£¬ÐèÒªÖØÐ´hasSubMenu()·½·¨²¢·µ»Øtrue£¬È»ºóÔÚonPrepareSubMenuͨ¹ýµ÷ÓÃSubMenuµÄadd()·½·¨Ìí¼Ó×Ӳ˵¥¡£
½Ó×ÅÐÞ¸Ämenu×ÊÔ´£¬ÔÚÀïÃæ¼ÓÈëMyActionProviderµÄÉùÃ÷£º
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.actionbartest.MainActivity" > <item android:id="@+id/action_share" android:actionProviderClass="com.example.actionbartest.MyActionProvider" android:icon="@drawable/ic_launcher" android:showAsAction="ifRoom" android:title="@string/action_share" /> ...... </menu> |
ÏÖÔÚÖØÐÂÔËÐÐһϴúÂ룬½á¹ûÈçͼËùʾ£º

Ìí¼Óµ¼º½Tabs
TabsµÄÓ¦ÓÿÉÒÔËãÊǷdz£¹ã·ºÁË£¬Ëü¿ÉÒÔʹµÃÓû§·Ç³£ÇáËɵØÔÚÄãµÄÓ¦ÓóÌÐòÖÐÇл»²»Í¬µÄÊÓͼ¡£¶øAndroid¹Ù·½¸ü¼ÓÍÆ¼öʹÓÃActionBarÖÐÌṩµÄTabs¹¦ÄÜ£¬ÒòΪËü¸ü¼ÓµÄÖÇÄÜ£¬¿ÉÒÔ×Ô¶¯ÊÊÅä¸÷ÖÖÆÁÄ»µÄ´óС¡£±ÈÈç˵£¬ÔÚÆ½°åÉÏÆÁÄ»µÄ¿Õ¼ä·Ç³£³ä×㣬Tabs»áºÍAction°´Å¥ÔÚͬһÐÐÏÔʾ£¬ÈçÏÂͼËùʾ£º

¶øÈç¹ûÊÇÔÚÊÖ»úÉÏ£¬ÆÁÄ»µÄ¿Õ¼ä²»¹»´óµÄ»°£¬TabsºÍAction°´Å¥Ôò»á·ÖΪÁ½ÐÐÏÔʾ£¬ÈçÏÂͼËùʾ£º

ÏÂÃæÎÒÃǾÍÀ´¿´Ò»ÏÂÈçºÎʹÓÃActionBarÌṩµÄTab¹¦ÄÜ£¬´óÖ¿ÉÒÔ·ÖΪÒÔϼ¸²½£º
1. ʵÏÖActionBar.TabListener½Ó¿Ú£¬Õâ¸ö½Ó¿ÚÌṩÁËTabʼþµÄ¸÷Öֻص÷£¬±ÈÈçµ±Óû§µã»÷ÁËÒ»¸öTabʱ£¬Äã¾Í¿ÉÒÔ½øÐÐÇл»TabµÄ²Ù×÷¡£
2.Ϊÿһ¸öÄãÏëÌí¼ÓµÄTab´´½¨Ò»¸öActionBar.TabµÄʵÀý£¬²¢ÇÒµ÷ÓÃsetTabListener()·½·¨À´ÉèÖÃActionBar.TabListener¡£³ý´ËÖ®Í⣬»¹ÐèÒªµ÷ÓÃsetText()·½·¨À´¸øµ±Ç°TabÉèÖñêÌâ¡£
3.×îºóµ÷ÓÃActionBarµÄaddTab()·½·¨½«´´½¨ºÃµÄTabÌí¼Óµ½ActionBarÖС£
¿´ÆðÀ´²¢²»¸´ÔÓ£¬×ܹ²¾ÍÖ»ÓÐÈý²½£¬ÄÇôÎÒÃÇÏÖÔÚ¾ÍÀ´³¢ÊÔһϰɡ£Ê×ÏȵÚÒ»²½ÐèÒª´´½¨Ò»¸öʵÏÖActionBar.TabListener½Ó¿ÚµÄÀ࣬´úÂëÈçÏÂËùʾ£º
public class TabListener<T extends Fragment> implements ActionBar.TabListener { private Fragment mFragment; private final Activity mActivity; private final String mTag; private final Class<T> mClass; public TabListener(Activity activity, String tag, Class<T> clz) { mActivity = activity; mTag = tag; mClass = clz; } public void onTabSelected(Tab tab, FragmentTransaction ft) { if (mFragment == null) { mFragment = Fragment.instantiate(mActivity, mClass.getName()); ft.add(android.R.id.content, mFragment, mTag); } else { ft.attach(mFragment); } } public void onTabUnselected(Tab tab, FragmentTransaction ft) { if (mFragment != null) { ft.detach(mFragment); } } public void onTabReselected(Tab tab, FragmentTransaction ft) { } } |
Õâ¶Î´úÂë²¢²»³¤£¬ÎÒÃǼòµ¥·ÖÎöһϡ£µ±Tab±»Ñ¡ÖеÄʱºò»áµ÷ÓÃonTabSelected()·½·¨£¬ÔÚÕâÀïÎÒÃÇÏÈÅжÏmFragmentÊÇ·ñΪ¿Õ£¬Èç¹ûΪ¿ÕµÄ»°¾Í´´½¨FragmentµÄʵÀý²¢µ÷ÓÃFragmentTransactionµÄadd()·½·¨£¬Èç¹û²»»á¿ÕµÄ»°¾Íµ÷ÓÃFragmentTransactionµÄattach()·½·¨¡£
¶øµ±TabûÓб»Ñ¡ÖеÄʱºò£¬Ôòµ÷ÓÃFragmentTransactionµÄdetach()·½·¨£¬½«UI×ÊÔ´Êͷŵô¡£
µ±Tab±»ÖØÐÂÑ¡ÖеÄʱºò»áµ÷ÓÃonTabReselected()·½·¨£¬Èç¹ûûÓÐÌØÊâÐèÇóµÄ»°£¬Í¨³£ÊDz»ÐèÒª½øÐд¦ÀíµÄ¡£
½ÓÏÂÀ´µÚ¶þ²½Òª¸øÃ¿Ò»¸öTab´´½¨Ò»¸öActionBar.TabµÄʵÀý£¬ÔÚ´Ë֮ǰҪÏÈ×¼±¸ºÃÿ¸öTabÒ³¶ÔÓ¦µÄFragment¡£±ÈÈç˵ÕâÀïÎÒÃÇÏë´´½¨Á½¸öTabÒ³£¬ArtistºÍAlbum£¬ÄǾÍÒªÏÈ×¼±¸ºÃÕâÁ½¸öTabÒ³¶ÔÓ¦µÄFragment¡£Ê×ÏÈн¨ArtistFragment£¬´úÂëÈçÏÂËùʾ£º
public class ArtistFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { TextView textView = new TextView(getActivity()); textView.setText("Artist Fragment"); textView.setGravity(Gravity.CENTER_HORIZONTAL); LinearLayout layout = new LinearLayout(getActivity()); LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); layout.addView(textView, params); return layout; } } |
ûÓÐʲôʵÖÊÐԵĴúÂ룬ֻÊÇÔÚTextViewÖÐÏÔʾÁËArtist FragmentÕâ¸ö×Ö·û´®¡£
È»ºóÈç·¨ÅÚÖÆ£¬Ð½¨AlbumFragment£¬´úÂëÈçÏÂËùʾ£º
public class AlbumFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { TextView textView = new TextView(getActivity()); textView.setText("Album Fragment"); textView.setGravity(Gravity.CENTER_HORIZONTAL); LinearLayout layout = new LinearLayout(getActivity()); LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); layout.addView(textView, params); return layout; } } |
Fragment¶¼×¼±¸ºÃÁËÖ®ºó£¬½ÓÏÂÀ´¾Í¿ÉÒÔ¿ªÊ¼´´½¨TabʵÀýÁË£¬´´½¨ºÃÁËÖ®ºóÔòÔÙµ÷ÓÃaddTab()·½·¨Ìí¼Óµ½ActionBarµ±ÖУ¬ÕâÁ½²½Í¨³£¶¼ÊÇÔÚActivityµÄonCreate()·½·¨ÖÐÖ´Ðе쬴úÂëÈçÏ£º
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle("ÌìÆø"); ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); setOverflowShowingAlways(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); Tab tab = actionBar .newTab() .setText(R.string.artist) .setTabListener( new TabListener<ArtistFragment>(this, "artist", ArtistFragment.class)); actionBar.addTab(tab); tab = actionBar .newTab() .setText(R.string.album) .setTabListener( new TabListener<AlbumFragment>(this, "album", AlbumFragment.class)); actionBar.addTab(tab); } |
¿ÉÒÔ¿´µ½£¬ÕâÀïÊÇʹÓÃÁ¬×ºµÄд·¨À´´´½¨TabµÄ¡£Ê×Ïȵ÷ÓÃActionBarµÄnewTab()·½·¨À´´´½¨Ò»¸öTabʵÀý£¬½Ó×ŵ÷ÓÃÁËsetText()·½·¨À´ÉèÖñêÌ⣬ȻºóÔÙµ÷ÓÃsetTabListener()·½·¨À´ÉèÖÃʼþ¼àÌýÆ÷£¬×îºóÔÙµ÷ÓÃActionBarµÄaddTab()·½·¨½«TabÌí¼Óµ½ActionBarÖС£
ºÃÁË£¬ÕâÑùµÄ»°´úÂë¾Í±àдÍêÁË£¬ÖØÐÂÔËÐÐһϳÌÐò£¬Ð§¹ûÈçÏÂͼËùʾ£º

×Ô¶¨ÒåActionBarÑùʽ
Ëä˵ActionBar¸øÓû§ÌṩÁËÒ»ÖÖÈ«¾ÖͳһµÄ½çÃæ·ç¸ñºÍ²Ù×÷·½Ê½£¬µ«Õâ²¢²»Òâζ×ÅËùÓÐÓ¦ÓóÌÐòµÄActionBar¶¼±ØÐëÒª³¤µÃһģһÑù¡£Èç¹ûÄãÐèÒªÐÞ¸ÄActionBarµÄÑùʽÀ´¸ü¼ÓºÃµØÊÊÅäÄãµÄÓ¦Ó㬿ÉÒԷdz£¼òµ¥µØÍ¨¹ýAndroidÑùʽºÍÖ÷ÌâÀ´ÊµÏÖ¡£
ÆäʵAndroidÄÚÖõöActivityÖ÷ÌâÖоÍÒѾ°üº¬ÁË"dark"»ò"light"ÕâÑùµÄActionBarÑùʽÁË£¬Í¬Ê±ÄãÒ²¿ÉÒԼ̳ÐÕâЩÖ÷Ì⣬Ȼºó½øÐиüÉîÒ»²½µÄ¶¨ÖÆ¡£
1. ʹÓÃÖ÷Ìâ
AndroidÖÐÓÐÁ½¸ö×î»ù±¾µÄActivityÖ÷Ìâ¿ÉÒÔÓÃÓÚÖ¸¶¨ActionBarµÄÑÕÉ«£¬·Ö±ðÊÇ£º
Theme.Holo£¬ÕâÊÇÒ»¸öÉîɫϵµÄÖ÷Ìâ¡£
Theme.Holo.Light£¬ÕâÊÇÒ»¸ödzɫϵµÄÖ÷Ìâ¡£
ÉîɫϵÖ÷ÌâÑùʽµÄЧ¹ûÈçÏÂͼËùʾ£º

dzɫϵÖ÷ÌâÑùʽµÄЧ¹ûÈçÏÂͼËùʾ£º

Äã¿ÉÒÔ½«ÕâЩÖ÷ÌâÓ¦Óõ½ÄãµÄÕû¸öÓ¦ÓóÌÐò£¬Ò²¿ÉÒÔÖ»Ó¦ÓÃÓÚij¸öActivity¡£Í¨¹ýÔÚAndroidManifest.xmlÎļþÖиø<application>»ò<activity>±êǩָ¶¨android:themeÊôÐԾͿÉÒÔʵÏÖÁË¡£±ÈÈ磺
<application android:theme="@android:style/Theme.Holo.Light" ... /> |
Èç¹ûÄãÖ»ÏëÈÃActionBarʹÓÃÉîɫϵµÄÖ÷Ì⣬¶øActivityµÄÄÚÈݲ¿·ÖÈÔȻʹÓÃdzɫϵµÄÖ÷Ì⣬¿ÉÒÔͨ¹ýÉùÃ÷Theme.Holo.Light.DarkActionBarÕâ¸öÖ÷ÌâÀ´ÊµÏÖ£¬Ð§¹ûÈçÏÂͼËùʾ£º

2. ×Ô¶¨Òå±³¾°
Èç¹ûÏëÒªÐÞ¸ÄActionBarµÄ±³¾°£¬ÎÒÃÇ¿ÉÒÔͨ¹ý´´½¨Ò»¸ö×Ô¶¨ÒåÖ÷Ìâ²¢ÖØÐ´actionBarStyleÊôÐÔÀ´ÊµÏÖ¡£Õâ¸öÊôÐÔ¿ÉÒÔÖ¸ÏòÁíÍâÒ»¸öÑùʽ£¬È»ºóÎÒÃÇÔÚÕâ¸öÑùʽÖÐÖØÐ´backgroundÕâ¸öÊôÐԾͿÉÒÔÖ¸¶¨Ò»¸ödrawable×ÊÔ´»òÑÕÉ«£¬´Ó¶øÊµÏÖ×Ô¶¨Òå±³¾°µÄ¹¦ÄÜ¡£
±à¼styles.xmlÎļþ£¬ÔÚÀïÃæ¼ÓÈëÒ»¸ö×Ô¶¨ÒåµÄÖ÷Ì⣬ÈçÏÂËùʾ£º
<resources> <style name="CustomActionBarTheme" parent="@android:style/Theme.Holo.Light"> <item name="android:actionBarStyle">@style/MyActionBar</item> </style> <style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar"> <item name="android:background">#f4842d</item> </style> </resources> |
¿ÉÒÔ¿´µ½£¬ÕâÀïÎÒÃǶ¨ÒåÁËÒ»¸öCustomActionBarThemeÖ÷Ì⣬²¢ÈÃËü¼Ì³Ð×ÔTheme.Holo.Light¡£È»ºóÔÚÆäÄÚ²¿ÖØÐ´ÁËactionBarStyleÕâ¸öÊôÐÔ£¬È»ºó½«Õâ¸öÊôÐÔÖ¸ÏòÁËMyActionBarÕâ¸öÑùʽ£¬ÎÒÃÇÔÚÕâ¸öÑùʽÖÐÓÖÖØÐ´ÁËbackgroundÊôÐÔ£¬²¢¸øËüÖ¸¶¨ÁËÒ»¸ö±³¾°É«¡£
ÏÖÔÚÖØÐÂÔËÐÐһϳÌÐò£¬Ð§¹ûÈçÏÂͼËùʾ£º

ÕâÑùÎÒÃǾͳɹ¦ÐÞ¸ÄActionBarµÄ±³¾°É«ÁË¡£²»¹ýÏÖÔÚ¿´ÉÏÈ¥»¹Óеã¹Ö¹ÖµÄ£¬ÒòΪֻÊÇActionBarµÄ±³¾°É«¸Ä±äÁË£¬TabsµÄ±³¾°É«»¹ÊÇÔÀ´µÄÑù×Ó£¬ÕâÑù¾Í¸Ð¾õ²»Ì«Ðµ÷¡£ÄÇôÏÂÃæÎÒÃÇÂíÉϾÍÀ´ÐÞ¸ÄÒ»ÏÂTabsµÄ±³¾°É«£¬±à¼styles.xmlÎļþ£¬ÈçÏÂËùʾ£º
<resources> <style name="CustomActionBarTheme" parent="@android:style/Theme.Holo.Light"> <item name="android:actionBarStyle">@style/MyActionBar</item> </style> <style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar"> <item name="android:background">#f4842d</item> <item name="android:backgroundStacked">#d27026</item> </style> </resources> |
¿ÉÒÔ¿´µ½£¬ÕâÀïÓÖÖØÐ´ÁËbackgroundStackedÊôÐÔ£¬Õâ¸öÊôÐÔ¾ÍÊÇÓÃÓÚÖ¸¶¨Tabs±³¾°É«µÄ¡£ÄÇôÔÙ´ÎÖØÐÂÔËÐгÌÐò£¬Ð§¹ûÈçÏÂͼËùʾ£º

3. ×Ô¶¨ÒåÎÄ×ÖÑÕÉ«
ÏÖÔÚÕû¸öActionBarµÄÑÕÉ«ÊÇÊôÓÚÆ«°µÏµµÄ£¬¶øActionBarÖÐÎÄ×ÖµÄÑÕÉ«ÓÖÆ«Æ«ÊǺÚÉ«µÄ£¬ËùÒÔ¿´ÆðÀ´²¢²»Êæ·þ£¬ÄÇô½ÓÏÂÀ´ÎÒÃǾÍѧϰһÏÂÈç¹û×Ô¶¨ÒåÎÄ×ÖÑÕÉ«£¬½«ÎÄ×ÖÑÕÉ«¸Ä³É°×É«¡£
ÐÞ¸Ästyles.xmlÎļþ£¬ÈçÏÂËùʾ£º
<resources> ...... <style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar"> ...... <item name="android:titleTextStyle">@style/MyActionBarTitleText</item> </style> <style name="MyActionBarTitleText" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title"> <item name="android:textColor">#fff</item> </style> </resources> |
¿ÉÒÔ¿´µ½£¬ÕâÀïÔÚMyActionBarÑùʽÀïÃæÖØÐ´ÁËtitleTextStyleÊôÐÔ£¬²¢½«ËüÖ¸ÏòÁËÁíÒ»¸ö×Ô¶¨ÒåÑùʽMyActionBarTitleText£¬½Ó×ÅÎÒÃÇÔÚÕâ¸öÑùʽÖÐÖ¸¶¨textColorµÄÑÕÉ«ÊÇ#fff£¬Ò²¾ÍÊǰ×É«¡£
ÏÖÔÚÖØÐÂÔËÐÐһϳÌÐò£¬½á¹ûÈçÏÂͼËùʾ£º

OK£¬ActionBar±êÌâÎÄ×ÖµÄÑÕÉ«ÒѾ³É¹¦¸Ä³É°×É«ÁË£¬ÄÇTab±êÌâµÄÎÄ×ÖÓÖ¸ÃÔõôÐÞ¸ÄÄØ£¿¼ÌÐø±à¼styles.xmlÎļþ£¬ÈçÏÂËùʾ£º
<resources> <style name="CustomActionBarTheme" parent="@android:style/Theme.Holo.Light"> <item name="android:actionBarStyle">@style/MyActionBar</item> <item name="android:actionBarTabTextStyle">@style/MyActionBarTabText</item> </style> <style name="MyActionBarTabText" parent="@android:style/Widget.Holo.ActionBar.TabText"> <item name="android:textColor">#fff</item> </style> </resources> |
ÕâÀïÎÒÃÇÔÚCustomActionBarThemeÖ÷ÌâÖÐÖØÐ´actionBarTabTextStyleÊôÐÔ£¬²¢½«ËüÖ¸ÏòÒ»¸öн¨µÄMyActionBarTabTextÑùʽ£¬È»ºóÔÚÕâ¸öÑùʽÖÐÖØÐ´textColorÊôÐÔ£¬½«ÑÕɫָ¶¨Îª°×É«¼´¿É¡£
ÖØÐÂÔËÐÐһϳÌÐò£¬½á¹ûÈçÏÂͼËùʾ£º

4. ×Ô¶¨ÒåTab Indicator
ΪÁË¿ÉÒÔÃ÷È··Ö±æ³öÎÒÃǵ±Ç°Ñ¡ÖеÄÊÇÄÄÒ»¸öTabÏͨ³£Çé¿ö϶¼»áÔÚÑ¡ÖÐTabµÄÏÂÃæ¼ÓÉÏÒ»ÌõºáÏß×÷Ϊ±êʶ£¬Õâ±»³Æ×÷Tab
Indicator¡£ÄÇôÉÏͼÖеÄTab IndicatorÊÇÀ¶É«µÄ£¬Ã÷ÏÔºÍÕûÌå·ç¸ñ²»Ïà·û£¬ËùÒÔÎÒÃǽÓÏÂÀ´¾ÍѧϰһÏÂÈçºÎ×Ô¶¨ÒåTab
Indicator¡£
Ê×ÏÈÎÒÃÇÐèÒªÖØÐ´actionBarTabStyleÕâ¸öÊôÐÔ£¬È»ºó½«ËüÖ¸ÏòÒ»¸öн¨µÄTabÑùʽ£¬È»ºóÖØÐ´backgroundÕâ¸öÊôÐÔ¼´¿É¡£ÐèҪעÒâµÄÊÇ£¬background±ØÐëÒªÖ¸¶¨Ò»¸östate-list
drawableÎļþ£¬ÕâÑùÔÚ¸÷ÖÖ²»Í¬×´Ì¬Ï²ÅÄÜÏÔʾ³ö²»Í¬µÄЧ¹û¡£
ÄÇôÔÚ¿ªÊ¼Ö®Ç°£¬Ê×ÏÈÎÒÃÇÐèҪ׼±¸ËÄÕÅͼƬ£¬·Ö±ðÓÃÓÚ±íʾTabµÄËÄÖÖ״̬£¬ÈçÏÂËùʾ£º

ÕâËÄÕÅͼƬ·Ö±ð±íʾTabÑ¡ÖÐδ°´Ï£¬Ñ¡ÖÐÇÒ°´Ï£¬Î´Ñ¡ÖÐδ°´Ï£¬Î´Ñ¡ÖÐÇÒ°´ÏÂÕâËÄÖÖ״̬£¬ÄÇô½Ó×Åн¨res/drawable/actionbar_tab_indicator.xmlÎļþ£¬´úÂëÈçÏÂËùʾ£º
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/tab_unselected" /> <item android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/tab_selected" /> <item android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/tab_unselected_pressed" /> <item android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/tab_selected_pressed" /> </selector> |
ËÄÖÖ״̬·Ö±ðÒýÓÃÁËËÄÕÅͼƬ£¬ÕâÑù¾Í°Ñstate-list drawableÎļþдºÃÁË¡£½Ó×ÅÐÞ¸Ästyle.xmlÎļþ£¬´úÂëÈçÏÂËùʾ£º
<resources> <style name="CustomActionBarTheme" parent="@android:style/Theme.Holo.Light"> ...... <item name="android:actionBarTabStyle">@style/MyActionBarTabs</item> </style> <style name="MyActionBarTabs" parent="@android:style/Widget.Holo.ActionBar.TabView"> <item name="android:background">@drawable/actionbar_tab_indicator</item> </style> </resources> |
ÕâÀïÏÈÊÇÖØÐ´ÁËactionBarTabStyleÕâ¸öÊôÐÔ£¬²¢½«ËüÖ¸ÏòÁËÁíÒ»¸ö×Ô¶¨ÒåÑùʽMyActionBarTabs£¬½Ó×ÅÔÚÕâ¸öÑùʽÖÐÖØÐ´backgroundÊôÐÔ£¬È»ºóÖ¸ÏòÎÒÃǸղŴ´½¨µÄactionbar_tab_indicator¼´¿É¡£
ÏÖÔÚÖØÐÂÔËÐÐһϳÌÐò£¬Ð§¹ûÈçÏÂËùʾ£º

¿ÉÒÔ¿´µ½£¬Tab IndicatorµÄÑÕÉ«ÒѾ±ä³ÉÁ˰×É«£¬ÕâÑù¿´ÉÏÈ¥¾Íе÷µÃ¶àÁË¡£
³ý´ËÖ®Í⣬Action Bar»¹ÓÐÐíÐí¶à¶àµÄÊôÐÔ¿ÉÒÔ½øÐÐ×Ô¶¨Ò壬ÕâÀïÎÒÃÇÎÞ·¨Ò»Ò»º¸Çµ½±¾ÆªÎÄÕÂÖУ¬¸ü¶àµÄ×Ô¶¨ÒåÊôÐÔÇë²Î¿¼¹Ù·½Îĵµ½øÐÐѧϰ¡£
ºÃÁË£¬±¾ÆªÎÄÕµĽ²½â¾Íµ½ÕâÀ½áºÏÉÏÏÂÁ½Æª£¬ÎÒÃÇÒѾ°ÑActionBarÖÐ×î³£ÓõŦÄܶ¼Ñ§»áÁË£¬ÏÂÆªÎÄÕÂÖÐÎÒ»á´øÁì´ó¼ÒÒ»ÆðʵսAction
BarµÄÓ÷¨£¬¸ÐÐËȤµÄÅóÓÑÇë¼ÌÐøÔĶÁ Android ActionBarÓ¦ÓÃʵս£¬¸ß·Â΢ÐÅÖ÷½çÃæµÄÉè¼Æ
¡£
|