国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 系統 > 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 。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
欧美日韩在线资源| 在线免费看黄网站| 免费视频二区| 久热中文字幕精品视频在线| www中文字幕在线观看| av在线资源网| 日本福利午夜视频在线| 久久精品免视着国产成人| 丁香在线视频| 国产精品欧美韩国日本久久| 国产一二三区精品视频| 最近中文av字幕在线中文| 国产三级视频在线看| 99re在线视频| 国产麻豆精品视频一区二区 | 日本视频二区| 中文字幕高清av| 夜夜爽视频导航| 国产天堂在线| 国产在线看片| 三级小说一区| 亚洲欧美日韩一区成人| 国产视频你懂的| 亚洲精品在线播放视频| 国产三区四区在线观看| 九九热视频在线观看| av在线播放国产| 国产成人精品18| 最近免费中文字幕在线第一页 | 国产一区电影| www在线观看播放免费视频日本| 国产精品伦理一区二区三区 | 狂野欧美性猛交xxxx乱大交| 国产黄色大片在线观看| 国产麻豆精品入口在线观看| www狠狠操| eeuss影院www在线播放| 精品视频麻豆入口| 国产香蕉尹人视频在线| 久久精品视频免费看| 天堂√中文在线| wwwww在线观看免费视频| av福利在线| 国产不卡在线| 精品麻豆国产| 亚洲精品视频区| www.91av| 成年人在线观看| 欧美xxxx黑人又粗又长| 热99在线观看| 午夜视频在线免费| 国产精品视频h| 伊人av免费在线观看| 午夜小视频在线| 丁香花在线电影小说观看| 国产毛片毛片| 国产香蕉视频在线观看| 99综合精品久久| 99reav在线| 日本韩国精品一区二区| 久草在线视频网| 国产黄色高清在线| 青草视频在线播放| 国产一区久久精品| 亚洲综合天堂网| 久久久久国产精品嫩草影院| 国产精品久久麻豆| 欧美日韩在线中文字幕| 国产精品yjizz视频网一二区 | 精品一区二区三区高清免费不卡| 国产二区在线播放| 欧美精品se| 怡红院av在线| 中文字幕亚洲免费| jizz国产| 中文av字幕| 国产日产一区二区| 男女午夜视频在线观看| 91嫩草在线播放| 国产精品亚洲色图| 亚洲精品影视在线| 国产www网站| 91sp网站在线观看入口| 亚洲第一成年免费网站| 国产鲁鲁视频在线观看特色| 在线看a视频| 国产91久久久久| 国产三级在线看| 国产网红在线| 自拍亚洲国产| 尤物视频免费在线观看| 九九色在线观看| 亚洲精品少妇久久久久久| 999福利在线视频| 国产精品美女一区二区视频| 午夜视频99| 1区2区3区在线| 国产字幕在线看| 四虎在线免费视频| 在线免费国产| 四虎成人精品在永久在线观看| 精品无人区乱码1区2区3区免费| 国产视频你懂的| 国产高清一级片| 国产成人综合亚洲欧美在| 国产精品国产三级国产试看| 成人亚洲一区二区三区| 国产在线超碰| 国产视频中文字幕在线观看| 国产丝袜在线观看视频| 国产精品美女视频免费观看软件 | 中文字幕免费中文| 国产羞羞视频在线观看| 国产黄色在线网站| 国产极品嫩模在线视频一区| 国产黄色网页| 亚洲视频日韩| 青青艹在线视频| 九九精品九九| 国产野外战在线播放| 精品卡1卡2卡三卡免费网站| 7777在线| 人人九九精品| 国产乱码在线| 精品视频麻豆入口| 久久精品亚洲7777影院| 国产夫妻视频| 国产在线二区| 天天插天天色| 国产三级视频在线播放线观看| 亚洲wwwwww| 尤物视频在线看| 亚洲欧美综合乱码精品成人网| 国产综合视频一区二区三区免费| 国产黄色高清在线| 美女免费视频黄| 国产黄色网页| 国产免费福利| 四虎国产精品永久在线| 国产极品一区二区三区| 激情网站在线| 日韩a视频在线观看| 国产精品爱久久久久久久小说 | 国产精品伦一区二区三区视频| 性国产高清在线观看| 国产精品伦一区二区三区视频| 懂色av中文在线| 开心丁香婷婷深爱五月| 国产福利片在线| 国产免费高清| 成在线人视频免费视频| 午夜性爽视频男人的天堂| 国产高清一级片| 精品一区二区在线欧美| 国产精品ⅴa有声小说| 国产小黄视频| 国产系列在线观看| 国产青草视频在线观看视频| 午夜在线小视频| 99热在线免费播放| 最新中文字幕在线| 中文字幕在线观看av| 五月天亚洲激情| 国产精品一二三区视频| 国产在线观看18| 国产一级电影网| 国产特黄在线| av在线free| 国产中文在线视频| 中文字幕人成高视频| 国产一起色一起爱| 精品一区二区观看| eeuss影院www在线播放| 久草.com| 国产极品视频| www.毛片| 最近中文字幕mv免费高清电影| 五月天亚洲激情| 91蜜桃在线视频| 日本啊v在线| 最近中文字幕av免费高清| 国产夫妻视频| 青草在线视频在线观看| 国产天堂素人系列在线视频| 69国产精品视频| 成 人免费视频播放| 国产一卡2卡3卡免费网站| 国产啊啊啊视频在线观看| 欧美性xxxx交| 国产一起色一起爱| 欧美成人精品福利网站| 国产高清免费视频| 超碰在线影院| 中文字幕2019第三页| 国产原创精品视频| 日本一二区视频| 国产精品久久久久久久牛牛| 九九热免费在线视频| 在线免费观看你懂的| 国产日本视频|