亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Mono for Android 實現高效的導航(Effective Navigation)

2020-04-11 12:38:31
字體:
來源:轉載
供稿:網友

Android 4.0 系統定義了一系列的高效導航方式 (Effective Navigation), 主要包括標簽、下拉列表、以及向上和返回等, 本文介紹如何用 Mono for Android 實現這些的導航方式。

準備 Android 4.0 ICS 項目

新建 Android ICS 項目

打開 MonoDevelop , 新建一個 Mono for Android 項目, 并在項目的屬性頁將 Target Framework 設置為 Android 4.0.3 (Ice Cream Sandwich) , 如下圖所示:

準備 Android 4.0 ICS 項目

添加 Mono.Android.Support.v4 引用項

在解決方案窗口, 選中項目的引用節點, 右擊選擇編輯引用, 添加對 Mono.Android.Support.v4.dll 的引用, 如圖所示:

Mono.Android.Support.v4

在項目中新建一個目錄 SupportLib , 并添加對 android-support-v4.jar 文件(位于 android-sdk/extras/android/support/v4 目錄, 如果沒有, 需要用 SDK Manager 安裝)的引用, 并將 jar 文件的編譯動作 (BuildAction) 設置為 AndroidJavaLibrary , 如下圖所示:

引用 android-support-v4.jar

本文提到的導航都是根據 Android 4.0 設計規范中推薦的 ActionBar 實現的, 因此整個應用程序啟用帶 ActionBar 的主題, 如果使用 Java 的話, 需要手工編輯 AppManifest.xml 文件的設置, 而用 Mono for Android 的話, 基本上不需要手工編輯這個文件。

Mono for Android 的做法是, 新建一個 App 類, 繼承自 Android.App.Application 類, 并添加 Android.App.ApplicationAttribute 標記, 在編譯時, Mono for Android 會根據這些標記自動生成一個 AppManifest.xml 文件并打包到最終的 apk 文件中。

App 類的代碼如下

復制代碼 代碼如下:

[Application(Label = "@string/AppName", Icon = "@drawable/ic_launcher",
Theme = "@android:style/Theme.Holo.Light.DarkActionBar")]
public class App : Application {

public App(IntPtr javaReference, JniHandleOwnership transfer)
: base(javaReference, transfer) {
}
}

添加這個類之后, 項目中的每個 Activity 將默認都是用這個主題, 如果有 Activity 要使用其它的主題, 才需要添加自己的主題屬性。

標簽導航

Android 的標簽用 ActionBar 實現, 用戶既可以點擊標簽切換視圖, 也可以水平滑動切換視圖, 如下圖所示:

標簽導航

用戶既可以點擊上面的 ‘SECTION 0'、 ‘SECTION 1'、 ‘SECTION 2' 標簽切換視圖, 也可以在視圖上水平拖動切換視圖, 同時標簽選中項也要同步選中, 實現的代碼如下:

復制代碼 代碼如下:

[Activity (Label = "@string/AppName", Icon = "@drawable/ic_launcher", MainLauncher = true)]
public class MainActivity : FragmentActivity {

/// <summary>
/// AppSectionsPagerAdapter 提供要顯示的視圖, 繼承自
/// Mono.Android.Support.V4.View.PagerAdapter, 所有加載過視圖都保存在內存中,
/// 如果視圖占用內存過多, 考慮替換成 FragmentStatePagerAdapter 。
/// </summary>
AppSectionsPagerAdapter _appSectionsPagerAdapter;

/// <summary>
/// 用 ViewPager 來顯示視圖三個主視圖, 每次只顯示一個。
/// </summary>
ViewPager _viewPager;

protected override void OnCreate(Bundle bundle) {
base.OnCreate(bundle);

this.SetContentView(Resource.Layout.MainActivity);

// 創建 Adapter
this._appSectionsPagerAdapter = new AppSectionsPagerAdapter(this.SupportFragmentManager);
// 設置 ActionBar
var actionBar = this.ActionBar;
// 首頁不需要向上的 Home 按鈕
actionBar.SetHomeButtonEnabled(false);
// 設置標簽導航模式
actionBar.NavigationMode = ActionBarNavigationMode.Tabs;
// 設置 ViewPager 的 Adapter , 這樣用戶就可以水平滑動切換視圖了
this._viewPager = this.FindViewById<ViewPager>(Resource.Id.Pager);
this._viewPager.Adapter = this._appSectionsPagerAdapter;
// 當水平滑動切換視圖時, 設置選中的標簽
this._viewPager.PageSelected += delegate(object sender, ViewPager.PageSelectedEventArgs e) {
actionBar.SetSelectedNavigationItem(e.P0);
};

// 依次添加三個標簽, 并添加標簽的選中事件處理函數, 設置當前的視圖。
for (var i = 0; i < this._appSectionsPagerAdapter.Count; i++) {
var tab = actionBar.NewTab().SetText(this._appSectionsPagerAdapter.GetPageTitle(i));
tab.TabSelected += delegate(object sender, Android.App.ActionBar.TabEventArgs e) {
this._viewPager.CurrentItem = tab.Position;
};
actionBar.AddTab(tab);
}
}
}

左右導航

標簽導航并不適合所有的場景, 有時僅僅需要顯示視圖的標題即可, 但是同樣可以水平滑動切換視圖, 如下圖所示:

左右導航

這種導航方式相當于標簽式導航的簡化版, 用戶只可以左右滑動切換視圖, 實現的代碼如下:

復制代碼 代碼如下:

protected override void OnCreate(Bundle bundle) {
base.OnCreate(bundle);
this.SetContentView(Resource.Layout.CollectionDemoActivity);
// 創建 Adapter
this._demoCollectionPagerAdapter = new DemoCollectionPagerAdapter(this.SupportFragmentManager);

// 設置 ViewPager 的 Adapter
this._viewPager = this.FindViewById<ViewPager>(Resource.Id.Pager);
this._viewPager.Adapter = this.mDemoCollectionPagerAdapter;
}

因為要顯示標題, 所以這個 Activity 的 Layout 添加了一個 PagerTitleStrip , Layout 源代碼如下:
復制代碼 代碼如下:

<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/Pager"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<!--
PaterTitleStrip 即可顯示選中頁面的標題, 也顯示臨近選中的幾個視圖的標題
-->
<android.support.v4.view.PagerTitleStrip android:id="@+id/PagerTitleStrip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:background="#33b5e5"
android:textColor="#fff"
android:paddingTop="4dp"
android:paddingBottom="4dp" />

</android.support.v4.view.ViewPager>

下拉列表

下拉列表導航是在 ActionBar 中顯示一個下拉列表 (Spinner), 就像一個菜單, 只顯示選中的菜單項對應的視圖, 如下圖所示:

下拉列表導航

將 ActionBar 設置為下拉列表導航時, 一般不顯示 Activity 自身的標題, 因此需要將 Activity 的 Label 標記為空字符串, 并且 Activity 需要實現接口 ActionBar.IOnNavigationListener , ListNavigationActivity 的部分實現代碼如下:

復制代碼 代碼如下:

[Activity (Label = "")]
public class ListNavigationActivity
: FragmentActivity, ActionBar.IOnNavigationListener {

ListNavSectionsPagerAdapter _navSectionsPagerAdapter;

protected override void OnCreate(Bundle bundle) {
base.OnCreate(bundle);
/* 其他代碼省略 … */

// 設置 ActionBar
var actionBar = this.ActionBar;
// 將 Home 設置為向上
actionBar.SetDisplayHomeAsUpEnabled(true);
// 設置 ActionBar 的導航模式為下拉列表
actionBar.NavigationMode = ActionBarNavigationMode.List;

var titles = new string[this._navSectionsPagerAdapter.Count];
for (var i = 0; i < titles.Length; i++) {
titles[i] = this._navSectionsPagerAdapter.GetPageTitle(i);
}
// 設置列表導航的回調參數
actionBar.SetListNavigationCallbacks(
new ArrayAdapter(
actionBar.ThemedContext,
Resource.Layout.ListNavigationActivityActionbarListItem,
Android.Resource.Id.Text1,
titles
),
this
);
// 設置 ViewPager
this._viewPager = this.FindViewById<ViewPager>(Resource.Id.Pager);
this._viewPager.Adapter = this._navSectionsPagerAdapter;
// 當 ViewPager 的選中頁切換時, 同步 actionBar 的選中項。
this._viewPager.PageSelected += delegate(object sender, ViewPager.PageSelectedEventArgs e) {
actionBar.SetSelectedNavigationItem(e.P0);
};
}

// ActionBar.IOnNavigationListener
public bool OnNavigationItemSelected(int itemPosition, long itemId) {
this._viewPager.CurrentItem = itemPosition;
return true;
}
}

向上導航

所謂的向上導航, 就是在 Activity 的圖標上顯示一個向左的箭頭, 點擊圖標返回應用程序的上一級 Activity , 注意是上一級 Activity , 不是上一個 Activity , 關于向上與返回的區別, 可以看看 Android SDK 中的 Providing Ancestral and Temporal Navigation 一文, 將向上和返回講解的非常清楚, 在這里只討論 Mono for Android 的實現方式。

要顯示向上導航的按鈕, 需要在 OnCreate 方法中對 ActionBar 做如下設置:

復制代碼 代碼如下:

// 設置 ActionBar
var actionBar = this.ActionBar;
// 將 Home 按鈕顯示為向上, 提示用戶點擊這個按鈕可以返回應用程序的上一級。
actionBar.SetDisplayHomeAsUpEnabled(true);同時還需要重寫 OnOptionsItemSelected 方法, 當用戶點擊 Home 按鈕時, 做相應的處理, 實現向上導航的代碼如下:

public override bool OnOptionsItemSelected(Android.Views.IMenuItem item) {
// 作為示例, 只處理用戶點擊 Home 按鈕的情況。
if (item.ItemId == Android.Resource.Id.Home) {
// 當 Home 按鈕被點擊時會調用到這里
// 創建啟動上級 Activity 的 Intent
var upIntent = new Intent(this, typeof(MainActivity));
// 使用 Suport Package 中的 NavUtils 來正確處理向上導航
if (NavUtils.ShouldUpRecreateTask(this, upIntent)) {
// 上級 Activity 沒有起動過, 需要創建一個新的導航棧道
TaskStackBuilder.Create(this)
// If there are ancestor activities, they should be added here.
.AddNextIntent(upIntent)
.StartActivities();
this.Finish();
}
else {
// 上級 Activity 已經創建過了, 直接導航就行。
NavUtils.NavigateUpTo(this, upIntent);
}
return true;
}
return base.OnOptionsItemSelected(item);
}

總結

Android 系統的導航與 iOS 相比復雜很多, 實現起來也相對麻煩一些, 好在有 Google 的 Support Package 已經多大部分操作提供了比較好的封裝, 還是比較容易掌握的。 文中的完整的源代碼已經提交的 Github 上, 地址是 https://github.com/beginor/MonoDroid/tree/master/EffectiveNavigation 。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美自拍视频在线| 日韩风俗一区 二区| 色狠狠av一区二区三区香蕉蜜桃| 久久久亚洲影院| 亚洲精品自在久久| 欧美亚洲另类制服自拍| 亚洲精品www久久久| 中文在线资源观看视频网站免费不卡| 在线播放精品一区二区三区| 亚洲成人三级在线| 欧美专区国产专区| 一区二区三区视频在线| 国产一区二区三区网站| 一个人www欧美| 国产成人综合精品在线| 日av在线播放中文不卡| 啊v视频在线一区二区三区| 91久久国产精品91久久性色| 九九久久久久99精品| 在线亚洲国产精品网| 第一福利永久视频精品| 国产精品午夜一区二区欲梦| 久久九九免费视频| 成人久久一区二区三区| 国产日韩欧美电影在线观看| 国产999精品久久久影片官网| 日韩电影大片中文字幕| 亚洲欧美日韩天堂一区二区| 久久在线视频在线| 国产欧美精品在线播放| 欧美激情一区二区三级高清视频| 伊人青青综合网站| 91午夜理伦私人影院| 亚洲国语精品自产拍在线观看| 日韩av中文字幕在线免费观看| 国产欧美精品va在线观看| 欧美激情第一页xxx| 久久精品91久久香蕉加勒比| 性欧美xxxx交| 色偷偷综合社区| 国产一区二区激情| 秋霞成人午夜鲁丝一区二区三区| 国产精品久久久久久久久久久不卡| 日韩av一卡二卡| 久久久久国产精品免费| 久久99精品国产99久久6尤物| 欧美日韩精品中文字幕| 欧美交受高潮1| 日韩在线视频导航| 538国产精品一区二区免费视频| 亚洲欧美成人在线| 57pao成人国产永久免费| 欧洲亚洲免费视频| 亚洲人成网7777777国产| 欧美天天综合色影久久精品| 亚洲福利在线视频| 国产在线观看一区二区三区| 久久国产精品久久久久久| 91精品国产自产在线观看永久| 欧美肥婆姓交大片| 懂色av中文一区二区三区天美| 欧美一级片久久久久久久| 欧美孕妇毛茸茸xxxx| 精品人伦一区二区三区蜜桃网站| 日韩中文综合网| 国产精品丝袜视频| 中文字幕精品一区久久久久| 日韩精品高清视频| 欧洲中文字幕国产精品| 91经典在线视频| 国产999精品| 97人人做人人爱| 91精品国产91久久久久久| 国产高清视频一区三区| 精品亚洲一区二区三区| 久久天天躁狠狠躁老女人| 狠狠躁夜夜躁人人爽天天天天97| 欧美裸体xxxx极品少妇| 亚洲自拍另类欧美丝袜| 奇门遁甲1982国语版免费观看高清| 久久久国产影院| 亚洲精品免费av| 久久精品国产免费观看| xxx欧美精品| 欧美黑人xxxx| 欧美天天综合色影久久精品| 97精品伊人久久久大香线蕉| 精品露脸国产偷人在视频| 国产aaa精品| 亚洲jizzjizz日本少妇| 欧美一级片一区| 亚洲国产精品视频在线观看| 黑人狂躁日本妞一区二区三区| 日韩高清不卡av| 日韩在线观看视频免费| 日韩免费中文字幕| 欧美性猛交xxxxx水多| 国产精品96久久久久久又黄又硬| 精品久久在线播放| 国产啪精品视频网站| 久久人91精品久久久久久不卡| 欧美日韩国产成人| 日韩亚洲综合在线| 九九热精品视频国产| 日韩av在线免费观看一区| 欧美韩日一区二区| 成人乱人伦精品视频在线观看| 亚洲精品久久久久国产| 欧美激情喷水视频| 国产视频久久久久| 国产aⅴ夜夜欢一区二区三区| 亚洲激情在线观看| 国产69精品久久久久9999| 日韩精品免费在线观看| 久久久久中文字幕2018| 成人疯狂猛交xxx| 日韩高清电影好看的电视剧电影| 欧美性猛交xxxx偷拍洗澡| 精品精品国产国产自在线| 最近2019好看的中文字幕免费| 欧美老女人性生活| 伊人伊成久久人综合网小说| 国内精品伊人久久| 91九色视频在线| 成人在线视频网| 91九色蝌蚪国产| 精品一区二区三区电影| 久久精品亚洲热| 亚洲欧美另类国产| 欧美在线观看www| 久久久久www| 国产在线视频91| 日韩欧美在线视频日韩欧美在线视频| 色青青草原桃花久久综合| 国产不卡在线观看| 精品国产一区二区三区久久| 亚洲国产成人爱av在线播放| 中文字幕日韩av综合精品| 国产精品流白浆视频| 久久亚洲影音av资源网| 欧美午夜久久久| 亚洲综合在线做性| 亚洲人成网站999久久久综合| 亚洲视频网站在线观看| 97精品一区二区三区| 中文字幕少妇一区二区三区| 久久视频在线视频| 成人免费大片黄在线播放| 久久久久久久影院| 亚洲a中文字幕| 久久免费视频网站| 久久97久久97精品免视看| 午夜免费久久久久| 在线视频亚洲欧美| 国产欧美日韩亚洲精品| 国产噜噜噜噜久久久久久久久| 91久久精品美女高潮| 精品亚洲国产成av人片传媒| 国产成人激情视频| 日韩有码在线播放| 中文字幕亚洲欧美日韩高清| 国产婷婷色综合av蜜臀av| 午夜精品蜜臀一区二区三区免费| 91超碰caoporn97人人|