Android移動應(yīng)用開發(fā)-菜單與對話框設(shè)計_第1頁
Android移動應(yīng)用開發(fā)-菜單與對話框設(shè)計_第2頁
Android移動應(yīng)用開發(fā)-菜單與對話框設(shè)計_第3頁
Android移動應(yīng)用開發(fā)-菜單與對話框設(shè)計_第4頁
Android移動應(yīng)用開發(fā)-菜單與對話框設(shè)計_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

Android移動應(yīng)用開發(fā)

010302040706認識Android列表與適配器菜單與對話框設(shè)計UI控件設(shè)計設(shè)計用戶界面創(chuàng)建Android項目Android本地存儲書目錄140911BroadcastReceiver與廣播通信Service與后臺服務(wù)設(shè)計ContentProvider與應(yīng)用間數(shù)據(jù)共享網(wǎng)絡(luò)連接與管理05Activity與Fragment08131210線程間的通信與異步機制Android性能分析與測試

菜單與對話框設(shè)計章目錄7.1菜單設(shè)計7.2對話框設(shè)計7.3應(yīng)用欄設(shè)計7.1.1初識菜單選項菜單選項菜單(OptionsMenu)是Activity的主菜單項,放置對應(yīng)用產(chǎn)生全局影響的操作,如“搜索”“設(shè)置”等。選項菜單放置在應(yīng)用欄的右上角,如圖所示。上下文菜單上下文菜單(ContextMenu)是用戶長按某一元素時出現(xiàn)的浮動菜單。它提供的操作將影響所選內(nèi)容或上下文框架,如圖所示。上下文菜單選項菜單示例上下文菜單示例7.1.1初識菜單側(cè)滑菜單側(cè)滑菜單(SlideMenu)是由

com.google.android.material.navigation

包提供的

NavigationView控件實現(xiàn)的菜單,如圖所示。動作菜單動作菜單(ActionMenu)在屏幕頂部欄顯示影響所選內(nèi)容的操作項目,并允許用戶選擇多項,如圖所示。側(cè)滑菜單示例動作菜單示例7.1.1初識菜單彈出菜單彈出菜單(PopupMenu)以垂直列表形式顯示一系列項目,并且該列表會固定到調(diào)用該菜單的視圖中。它特別適用于提供與特定內(nèi)容相關(guān)的大量操作,或者為命令的另一部分提供選項。與上下文菜單不同,彈出菜單中的操作不會直接影響對應(yīng)的內(nèi)容。彈出菜單適用于與Activity中的內(nèi)容區(qū)域相關(guān)的擴展操作,如圖所示。7.1.2創(chuàng)建菜單資源創(chuàng)建菜單資源創(chuàng)建菜單資源的基本步驟如下。在res/menu/目錄上右擊,選擇“New”>“MenuResourceFile”。在打開的對話框中輸入菜單資源的名稱。在Design視圖中,拖曳菜單元素到界面,并在“Properties”窗格中設(shè)置菜單屬性,如圖所示。7.1.2創(chuàng)建菜單資源使用菜單資源是一種很好的做法,它具有如下優(yōu)點。將菜單內(nèi)容與應(yīng)用的行為代碼分離。B允許利用應(yīng)用資源框架,為不同的平臺版本、屏幕尺寸和其他配置創(chuàng)建備用菜單配置。C更易于使用XML可視化菜單結(jié)構(gòu)。A7.1.2創(chuàng)建菜單資源菜單資源的組成下面是通過向?qū)?chuàng)建NavigationDrawerActivity自動生成的菜單資源。<?xmlversion="1.0"encoding="utf-8"?><menuxmlns:android="/apk/res/android"><groupandroid:checkableBehavior="single"><itemandroid:id="@+id/nav_camera"android:icon="@mipmap/ic_menu_camera"android:title="Import"/><itemandroid:id="@+id/nav_gallery"android:icon="@mipmap/ic_menu_gallery"android:title="Gallery"/><itemandroid:id="@+id/nav_slideshow"android:icon="@mipmap/ic_menu_slideshow"android:title="Slideshow"/><itemandroid:id="@+id/nav_manage"android:icon="@mipmap/ic_menu_manage"android:title="Tools"/></group><itemandroid:title="Communicate"><menu><itemandroid:id="@+id/nav_share"android:icon="@mipmap/ic_menu_share"android:title="Share"/><itemandroid:id="@+id/nav_send"android:icon="@mipmap/ic_menu_send"android:title="Send"/></menu></item></menu>7.1.2創(chuàng)建菜單資源(1)<item>標簽<item>標簽定義一個菜單項,可以包含一個<menu>標簽。<item>標簽必須為<menu>或<group>標簽的子標簽。<item>標簽的屬性包括以下幾項。android:idandroid:iconandroid:titleandroid:showAsActionifRoomneveralwayswithTextcollapseActionView<?xmlversion="1.0"encoding="utf-8"?><menuxmlns:android="/apk/res/android"><itemandroid:id="@+id/file"android:title="@string/file"><!--"file"submenu--><menu><itemandroid:id="@+id/create_new"android:title="@string/create_new"/><itemandroid:id="@+id/open"android:title="@string/open"/></menu></item></menu>7.1.2創(chuàng)建菜單資源(2)<group>標簽<group>標簽定義一個菜單組,相同的菜單組可以一起設(shè)置其屬性。<group>標簽的屬性說明如下。android:id:唯一標識該菜單組的引用ID。android:menuCategory:對菜單進行分類,定義菜單的優(yōu)先級。android:orderInCategory:設(shè)置菜單項的優(yōu)先級(取值一般是100的整數(shù)倍)。數(shù)值越大,優(yōu)先級越低。android:checkableBehavior:菜單項的選擇模式。android:visible:菜單組是否可見。android:enabled:菜單組是否可用。7.1.3設(shè)計選項菜單創(chuàng)建選項菜單的一般步驟如下。在res/menu中創(chuàng)建和編輯menu.xml。在當前的Activity中加載菜單資源文件。@OverridepublicbooleanonCreateOptionsMenu(Menumenu){//加載菜單xml資源getMenuInflater().inflate(R.menu.main,menu);returntrue;}通過onOptionsItemSelected()回調(diào)方法捕捉菜單觸發(fā)事件。@OverridepublicbooleanonOptionsItemSelected(MenuItemitem){//處理菜單項的點擊事件(含主頁和返回事件)intid=item.getItemId();//匹配菜單IDif(id==R.id.action_settings){returntrue;}returnsuper.onOptionsItemSelected(item);}7.1.3設(shè)計選項菜單通過onPrepareOptionsMenu()方法更改MenuItems的屬性(可選)。@OverridepublicbooleanonPrepareOptionsMenu(Menumenu){super.onPrepareOptionsMenu(menu);intidx=myListView.getSelectedItemPosition();//通過addingNew的判斷來確定REMOVE_TODO的text的值StringremoveTitle=getString(addingNew?R.string.cancel:R.string.remove);MenuItemremoveItem=menu.findItem(REMOVE_TODO);removeItem.setTitle(removeTitle);//只有在添加或ListView被選中的情況下REMOVE_TODO菜單項才可見removeItem.setVisible(addingNew||idx>-1);returntrue;}7.1.3設(shè)計選項菜單也可以在Java中動態(tài)添加菜單,例如:@OverridepublicbooleanonCreateOptionsMenu(Menumenu){super.onCreateOptionsMenu(menu);MenuItemitemAdd=menu.add(0,ADD_NEW_TODO,Menu.NONE,R.string.add_new);MenuItemitemRem=menu.add(0,REMOVE_TODO,Menu.NONE,R.string.remove);itemAdd.setIcon(R.drawable.add_new_item);itemRem.setIcon(R.drawable.remove_item);itemAdd.setShortcut('0','a');itemRem.setShortcut('1','r');returntrue;}7.1.4設(shè)計側(cè)滑菜單NavigationView是一個導(dǎo)航菜單框架,其使用菜單資源填充數(shù)據(jù)。NavigationView的典型用途就是配合androidx.drawerlayout.widget包的DrawerLayout實現(xiàn)抽屜式側(cè)滑,它作為其中的Drawer部分,即導(dǎo)航菜單的本體部分。<?xmlversion="1.0"encoding="utf-8"?><androidx.drawerlayout.widget.DrawerLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:id="@+id/drawer_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"tools:openDrawer="start">7.1.4設(shè)計側(cè)滑菜單DrawerLayout一般作為根布局,否則可能會出現(xiàn)觸摸事件被屏蔽的問題。Activity中可以用setNavigationItemSelectedListener()方法來設(shè)置當菜單項被單擊時的回調(diào)。<com.google.android.material.navigation.NavigationViewandroid:id="@+id/nav_view"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_gravity="start"android:fitsSystemWindows="true"app:headerLayout="@layout/nav_header_main3"app:menu="@menu/activity_main_drawer"/><includelayout="@layout/app_bar_main"android:layout_width="match_parent"android:layout_height="match_parent"/></androidx.drawerlayout.widget.DrawerLayout>7.1.4設(shè)計側(cè)滑菜單在基于Jetpack框架的應(yīng)用中,常用如下的格式響應(yīng)菜單事件。DrawerLayoutdrawer=findViewById(R.id.drawer_layout);NavigationViewnavigationView=findViewById(R.id.nav_view);//傳遞一組菜單IDmAppBarConfiguration=newAppBarConfiguration.Builder(R.id.nav_home,R.id.nav_gallery,R.id.nav_slideshow,R.id.nav_tools,R.id.nav_share,R.id.nav_send).setDrawerLayout(drawer).build();NavControllernavController=Navigation.findNavController(this,R.id.nav_host_fragment);NavigationUI.setupActionBarWithNavController(this,navController,mAppBarConfiguration);NavigationUI.setupWithNavController(navigationView,navController);任務(wù)7.1設(shè)計音樂播放器菜單【任務(wù)介紹】1.任務(wù)描述在第6章任務(wù)6.1的基礎(chǔ)上,實現(xiàn)左側(cè)側(cè)滑菜單、右上角選項菜單、長按的動作菜單。2.運行結(jié)果本任務(wù)運行結(jié)果如圖7-8和圖7-9所示。音樂播放器列表子項菜單運行結(jié)果音樂播放器側(cè)滑菜單運行結(jié)果章目錄7.1菜單設(shè)計7.2對話框設(shè)計7.3應(yīng)用欄設(shè)計7.2.1消息設(shè)計Toast是一個簡單的彈出式消息提示框,適用于確定用戶正在關(guān)注屏幕時顯示簡短消息它只占用消息所需的空間,用戶當前的Activity仍然是可見且能夠操作的。該消息提示框自動地淡入/淡出,不接受交互事件。圖中展示了Toast設(shè)計效果。一般使用Toast.makeText()方法來實例化一個Toast對象。例如:Toast.makeText(getApplicationContext(),"Toastmessage!",Toast.LENGTH_SHORT).show();Snackbar是com.google.android.material.snackbar包中的一個控件,可以在屏幕底部快速彈出消息,比Toast更加靈活。7.2.1消息設(shè)計使用Snackbar時需要添加如下的依賴。implementation'com.google.android.material.snackbar.Snackbar:1.0.0-rc01'Snackbar基本語法如下。Snackbar.make(view,message,duration).setAction(actionmessage,clicklistener).show();Snackbar具有以下特點。一小段時間之后或者用戶與屏幕觸發(fā)交互,Snackbar會自動消失。Snackbar可以包含一個可選的操作。把Snackbar劃出屏幕,即可棄用。作為一條上下文敏感的消息,Snackbar也是UI的一部分,并在屏幕內(nèi)所有元素的上層顯示,而不是像Toast一樣位于屏幕中央。一個時刻只能有唯一的Snackbar顯示。7.2.1消息設(shè)計Snackbar設(shè)計效果如圖所示。Snackbar.make(coordinatorLayout,"這是massage",Snackbar.LENGTH_LONG).setAction("這是action",newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Toast.makeText(MainActivity.this,"message",Toast.LENGTH_SHORT).show();}}).show();示例如下。7.2.2對話框設(shè)計AlertDialogAlertDialog是Dialog的一個擴展,它能夠創(chuàng)建常見的對話框,如圖7-12所示。常見對話框示例7.2.2對話框設(shè)計下面的代碼演示了使用AlertDialog.Builder()方法創(chuàng)建帶兩個按鈕的AlertDialog的設(shè)計方法。常見對話框示例AlertDialog.Builderbuilder=newAlertDialog.Builder(this);builder.setTitle("Title").setMessage("Writeyourmessagehere.").setCancelable(false).setPositiveButton("YES",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intid){/*點擊“YES”按鈕時的事件處理*/}}).setNegativeButton("NO",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intid){dialog.cancel();}});AlertDialogalert=builder.create();7.2.2對話框設(shè)計帶兩個按鈕的AlertDialog的顯示效果如圖所示。AlertDialog.Builder中的重要方法如下。setTitle()setIcon()setMessage()setView()setItems()setMultiChoiceItems()setNeutralButton()setPositiveButton()setNegativeButton()create()show()7.2.2對話框設(shè)計下面的示例用setView()方法創(chuàng)建一個自定義AlertDialog。LayoutInflaterfactory=LayoutInflater.from(this);finalViewtextEntryView=factory.inflate(R.layout.alert_dialog_text_entry,null);AlertDialog.BuilderalertDialog=newAlertDialog.Builder(this);alertDialog.setTitle("Android提示");alertDialog.setView(textEntryView);alertDialog.setPositiveButton("OK",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhichButton){}});alertDialog.setNegativeButton("Cancel",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhichButton){}});alertDialog.show();自定義AlertDialog的顯示效果如圖所示。7.2.2對話框設(shè)計ProgressDialogProgressDialog是AlertDialog的擴展,它可以顯示一個進度的動畫——圓形進度條或長形進度條。ProgressDialog主要包括以下幾個方法。setProgressStyle()setIndeterminate()setCancelable()setButton()show()cancel()dismiss()setProgress()7.2.2對話框設(shè)計例如:ProgressDialogloading=newProgressDialog(getContext());loading.setCancelable(true);loading.setMessage("Preparingtodownload…");loading.setProgressStyle(ProgressDialog.STYLE_SPINNER);loading.show();顯示效果如左圖和右圖所示。7.2.2對話框設(shè)計進度對話框的默認樣式為圓形進度條。privatevoidshowProgressDialog(){ProgressDialogmProgressDialog=newProgressDialog(ProgressDialogActivity.this);mProgressDialog.setIcon(R.mipmap.ic_launcher);mProgressDialog.setTitle("DownloadGoingOn");mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);mProgressDialog.setMax(MAX_PROGRESS);mProgressDialog.setButton("Hide",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhichButton){}});mProgressDialog.setButton2("cancel",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhichButton){}});7.2.2對話框設(shè)計mProgressHandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){super.handleMessage(msg);if(mProgress>=MAX_PROGRESS){mProgressDialog.dismiss();}else{mProgress++;mProgressDialog.incrementProgressBy(1);mProgressHandler.sendEmptyMessageDelayed(0,100);}}};mProgress=0;mProgressDialog.setProgress(0);mProgressHandler.sendEmptyMessage(0);mProgressDialog.show();}7.2.3通知設(shè)計通知的構(gòu)成一個通知包括如下內(nèi)容(見右圖)。通知是可以在應(yīng)用的常規(guī)UI外部向用戶顯示的消息。通知提示如左圖所示。7.2.3通知設(shè)計創(chuàng)建通知創(chuàng)建通知的基本步驟如下。添加支持庫,代碼如下。implementation"com.android.support:support-compat:28.0.0"創(chuàng)建一個NotificationCompat的Builder構(gòu)造類。例如:NotificationCompat.Builderbuilder=newNotificationCompat.Builder(this,CHANNEL_ID).setSmallIcon(R.drawable.notification_icon).setContentTitle(textTitle).setContentText(textContent).setPriority(NotificationCompat.PRIORITY_DEFAULT);7.2.3通知設(shè)計定義通知的單擊事件。//創(chuàng)建一個顯示IntentIntentintent=newIntent(this,AlertDetails.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);PendingIntentpendingIntent=PendingIntent.getActivity(this,0,intent,0);NotificationCompat.Builderbuilder=newNotificationCompat.Builder(this,CHANNEL_ID).setSmallIcon(R.drawable.notification_icon).setContentTitle("Mynotification").setContentText("HelloWorld!").setPriority(NotificationCompat.PRIORITY_DEFAULT)//設(shè)置響應(yīng)處理Intent.setContentIntent(pendingIntent).setAutoCancel(true);7.2.3通知設(shè)計顯示通知,調(diào)用

NotificationManagerCompat.notify()通知,并將通知的唯一

ID

和NotificationCompat.Builder.build()通知的結(jié)果傳遞給它。例如:NotificationManagerCompatnotificationManager=NotificationManagerCompat.from(this);//notificationId必須是唯一的notificationManager.notify(notificationId,builder.build());響應(yīng)通知雖然通知操作都是可選的,但是至少應(yīng)向通知添加一個操作。一個通知可以提供多個操作。在通知內(nèi)部,操作本身由PendingIntent定義,PendingIntent包含在應(yīng)用中啟動Activity的Intent。7.2.3通知設(shè)計例如:IntentsnoozeIntent=newIntent(this,MyBroadcastReceiver.class);snoozeIntent.setAction(ACTION_SNOOZE);snoozeIntent.putExtra(EXTRA_NOTIFICATION_ID,0);PendingIntentsnoozePendingIntent=PendingIntent.getBroadcast(this,0,snoozeIntent,0);NotificationCompat.Builderbuilder=newNotificationCompat.Builder(this,CHANNEL_ID).setSmallIcon(R.drawable.notification_icon).setContentTitle("Mynotification").setContentText("HelloWorld!").setPriority(NotificationCompat.PRIORITY_DEFAULT).setContentIntent(pendingIntent).addAction(R.drawable.ic_snooze,getString(R.string.snooze),snoozePendingIntent);7.2.3通知設(shè)計例如,用戶可以通過直接回復(fù)操作在通知中回復(fù)短信或更新任務(wù)列表。直接回復(fù)操作在通知中顯示為一個額外按鈕,可打開文本輸入。用戶完成輸入后,系統(tǒng)會將文本回復(fù)附加到為通知操作指定的Intent,然后將Intent發(fā)送給指定的應(yīng)用。首先創(chuàng)建RemoteInput.Builder的實例以便添加到通知操作。手持式設(shè)備應(yīng)用使用該鍵檢索輸入的文本。代碼如下。//定義傳遞字符串信息的鍵privatestaticfinalStringKEY_TEXT_REPLY="key_text_reply";StringreplyLabel=getResources().getString(R.string.reply_label);RemoteInputremoteInput=newRemoteInput.Builder(KEY_TEXT_REPLY).setLabel(replyLabel).build();7.2.3通知設(shè)計然后為直接回復(fù)操作創(chuàng)建PendingIntent。//構(gòu)建響應(yīng)的PendingIntentPendingIntentreplyPendingIntent=PendingIntent.getBroadcast(getApplicationContext(),conversation.getConversationId(),getMessageReplyIntent(conversation.getConversationId()),PendingIntent.FLAG_UPDATE_CURRENT);使用addRemoteInput()方法將RemoteInput對象附加到操作。//創(chuàng)建回復(fù)動作并添加遠程輸入NotificationCompat.Actionaction=newNotificationCompat.Action.Builder(R.drawable.ic_reply_icon,getString(R.string.label),replyPendingIntent).addRemoteInput(remoteInput).build();7.2.3通知設(shè)計最后發(fā)出通知。//構(gòu)建Notification并指定動作NotificationnewMessageNotification=newNotification.Builder(context,CHANNEL_ID).setSmallIcon(R.drawable.ic_message).setContentTitle(getString(R.string.title)).setContentText(getString(R.string.content)).addAction(action).build();//發(fā)布NotificationNotificationManagerCompatnotificationManager=NotificationManagerCompat.from(this);notificationManager.notify(notificationId,newMessageNotification);7.2.3通知設(shè)計管理通知當需要為同一類型的事件多次發(fā)出同一通知時,應(yīng)避免創(chuàng)建全新的通知,而應(yīng)考慮通過更改之前通知的某些值/或為其添加某些值來更新通知。例如,Gmail通過增加未讀消息計數(shù)并將每封電子郵件的摘要添加到通知,告知用戶收到新的電子郵件。這被稱為“堆疊”通知。需要管理接收到的通知:(1)更新通知:要將通知設(shè)置為能夠更新,需要調(diào)用NotificationManager.notify()方法發(fā)出帶有通知ID的通知。(2)刪除通知:除非發(fā)生以下情況之一,通知被刪除,否則通知仍然可見。用戶單獨或通過使用“全部清除”清除了該通知(如果通知可以清除)。用戶單擊通知,且在創(chuàng)建通知時調(diào)用了setAutoCancel()方法。針對特定的通知ID調(diào)用了cancel()方法。該方法會刪除當前通知。調(diào)用了cancelAll()方法。章目錄7.1菜單設(shè)計7.2對話框設(shè)計7.3應(yīng)用欄設(shè)計7.3.1初識應(yīng)用欄Toolbar是從Android5.0開始推出的一個MaterialDesign風格的應(yīng)用欄控件。Toolbar不像ActionBar,一定要固定在Activity的頂部,而是可以放到界面的任意位置。除此之外,在設(shè)計Toolbar的時候,Google公司也留給開發(fā)者很多可定制修改的余地,例如以下幾項。設(shè)置導(dǎo)航欄圖標。設(shè)置App的標志。支持設(shè)置標題和子標題。支持添加一個或多個自定義控件。支持動作菜單。應(yīng)用欄設(shè)計效果如圖所示。7.3.2創(chuàng)建應(yīng)用欄在app/build.gradle中添加支持包依賴。使用Toolbar創(chuàng)建應(yīng)用欄的基本步驟如下。implementation'androidx.appcompat:appcompat:1.0.2'確保Activity可以擴展AppCompatActivity。publicclassMainActivityextendsAppCompatActivity{…}在AndroidManifest清單中,在<activity>標簽中設(shè)置一個使用AppCompat的AppTheme.NoActionBar主題。<activityandroid:name=".MainActivity"android:label="@string/app_name"android:theme="@style/AppTheme.NoActionBar"><intent-filter><actionandroid:name="ent.action.MAIN"/><categoryandroid:name="ent.category.LAUNCHER"/></intent-filter></activity>7.3.2創(chuàng)建應(yīng)用欄其中的樣式定義如下。<stylename="AppTheme.NoActionBar"><itemname="windowActionBar">false</item><itemname="windowNoTitle">true</item></style>向Activity的布局添加一個Toolbar。例如:<?xmlversion="1.0"encoding="utf-8"?><androidx.coordinatorlayout.widget.CoordinatorLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">7.3.2創(chuàng)建應(yīng)用欄@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Toolbartoolbar=(Toolbar)findViewById(R.id.toolbar);setSupportActionBar(toolbar);}在Activity的onCreate()方法中,調(diào)用Activity的setSupportActionBar()方法,該方法會將工具欄設(shè)置為Activity的應(yīng)用欄。例如:<com.google.android.material.appbar.AppBarLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:theme="@style/AppTheme.AppBarOverlay"><androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="?attr/colorPrimary"app:popupTheme="@style/AppTheme.PopupOverlay"/></com.google.android.material.appbar.AppBarLayout><includelayout="@layout/content_main"/></androidx.coordinatorlayout.widget.CoordinatorLayout>7.3.3設(shè)置應(yīng)用欄應(yīng)用程序圖標導(dǎo)航應(yīng)用程序圖標默認出現(xiàn)在應(yīng)用欄的左側(cè)。通常的行為是在用戶單擊圖標時,讓應(yīng)用程序回到父級Activity或者回到初始狀態(tài)。例如:@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_my_child);//my_child_toolbar定義在布局文件中ToolbarmyChildToolbar=(Toolbar)findViewById(R.id.my_child_toolbar);setSupportActionBar(myChildToolbar);//初始化動作欄ActionBarab=getSupportActionBar();//添加返回導(dǎo)航按鈕ab.setDisplayHomeAsUpEnabled(true);}7.3.3設(shè)置應(yīng)用欄setDisplayHomeAsUpEnabled()方法將為應(yīng)用程序圖標增加一個表示向上一層動作的箭頭。注意:如果要實現(xiàn)返回功能,還需要對Activity設(shè)置父Activity。例如:<application…>…<!--Themain/homeactivity(ithasnoparentactivity)--><activityandroid:name="com.example.myfirstapp.MainActivity"…>…</activity><!--Achildofthemainactivity--><activityandroid:name="com.example.myfirstapp.MyChildActivity"android:label="@string/title_activity_child"android:parentActivityName="com.example.myfirstapp.MainActivity"><!--Parentactivitymeta-datatosupport4.0andlower--><meta-dataandroid:name="android.support.PARENT_ACTIVITY"android:value="com.example.myfirstapp.MainActivity"/></activity></application>7.3.3設(shè)置應(yīng)用欄例如,下面是一個onOptionsItemSelected()方法的實現(xiàn),它將返回HomeActivity用戶界面。@OverridepublicbooleanonOptionsItemSelected(MenuItemitem){switch(item.getItemId()){caseandroid.R.id.home://為動作欄中的圖標設(shè)置返回主屏Intent響應(yīng)Intentintent=newIntent(this,HomeActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);returntrue;default:returnsuper.onOptionsItemSelected(item);}}7.3.3設(shè)置應(yīng)用欄添加SearchView應(yīng)用欄常見的設(shè)置是添加一個SearchView,即搜索文本框。SearchView設(shè)計效果如圖所示。首先在菜單資源中添加一個菜單項。<itemandroid:id="@+id/action_search"android:icon="@android:drawable/ic_menu_search"android:title="搜索"app:showAsAction="ifRoom|collapseActionView"app:actionViewClass="androidx.appcompat.widget.SearchView"/>然后就可以在onCreateOptionsMenu()回調(diào)方法中獲取該菜單的SearchView實例,并通過該實例設(shè)置回車查詢監(jiān)聽。7.3.3設(shè)置應(yīng)用欄代碼如下。@OverridepublicbooleanonCreateOptionsMenu(Menumenu){//為動作欄加載菜單資源getMenuInflater().inflate(R.menu.menu_main,menu);MenuItemsearchItem=menu.findItem(R.id.action_search);SearchViewsearchView=(SearchView)MenuItemCompat.getActionView(searchItem);searchView.setOnQueryTextListener(this);returntrue;}7.3.3設(shè)置應(yīng)用欄添加ShareActionProvider分享應(yīng)用ActionProvider設(shè)計效果如圖所示。設(shè)計ActionProvider的一般步驟如下。在菜單資源的<item>標簽中加入android:actionProviderClass="android.widget.ShareActionProvider"屬性獲取ShareActionProvider的實例調(diào)用setShareIntent()方法更新ActionProvider7.3.4CoordinatorLayout+AppBarLayout應(yīng)用在使用CoordinatorLayout時,一般將CoordinatorLayout作為頂層布局,通過協(xié)調(diào)調(diào)度子布局的形式實現(xiàn)動畫效果。AppBarLayout是一個垂直的LinearLayout,實現(xiàn)了MaterialDesign中AppBar的ScrollingGestures特性。實際中,常用CoordinatorLayout+AppBarLayout來實現(xiàn)滾動的、可伸縮的應(yīng)用欄界面。CoordinatorLayout+AppBarLayout設(shè)計效果如圖所示。AppBarLayout

只有作為CoordinatorLayout

的直接子

View

時才能正常工作。7.3.4CoordinatorLayout+AppBarLayout應(yīng)用下

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論