この記事では、Angular NativeScript以外のアプリケーションでActionBarコンポーネントを使用する方法と、iOSおよびAndroidのいくつかの仕様について説明します。 説明されているすべてのシナリオは、適切なコードスニペットで示されています。 ActionBarは、AndroidのActionBarおよびiOSのNavigationBarを、NativeScript共通で抽象化したものです。
ページ内でActionBarを定義する方法は次のとおりです。
<Page xmlns="http://schemas.nativescript.org/tns.xsd">
<Page.actionBar>
<ActionBar title="My ActionBar"/>
</Page.actionBar>
<!-- Page content ... -->
</Page>
これ以降にこの記事で例示するコードは、ActionBarタグ部分のみを記載しています。
ActionBarのtitleプロパティを使用してタイトルを設定します。
<ActionBar title="Application Title"></ActionBar>
結果は次のとおりです。
タイトルの代わりにレンダリングするカスタムタイトルビューを設定できます。 以下の例は、titleViewの画像とラベルを組み合わせる方法を示しています(例にはActionBar定義のみが含まれています)。
<ActionBar title="test">
<StackLayout orientation="horizontal"
ios:horizontalAlignment="center"
android:horizontalAlignment="left">
<Image src="res://nativescript_logo" class="action-image"></Image>
<Label text="ativeScript" class="action-label"></Label>
</StackLayout>
</ActionBar>
.action-image {
width: 40;
height: 40;
vertical-align: center;
}
.action-label {
color: #3C5AFD;
font-size: 24;
font-weight: bold;
vertical-align: center;
}
結果は次のとおりです。
ActionItemテキストの代わりにレンダリングされるカスタムビューを設定できます。以下の例は、アイテム内の個別のラベルにロードする方法を示しています。
<Page>
<Page.actionBar>
<ActionBar>
<ActionBar.actionItems>
<ActionItem>
<ActionItem.actionView>
<StackLayout orientation="horizontal">
<Label text="Green" color="green"/>
<Label text="Red" color="red"/>
</StackLayout>
</ActionItem.actionView>
</ActionItem>
</ActionBar.actionItems>
</ActionBar>
</Page.actionBar>
...
</Page>
アプリケーションアイコンはAndroidにのみ設定できます。 デフォルトでは、アプリケーションアイコンは非表示になっています。 android.iconVisibilityプロパティをalwaysに設定することで表示させることができます。
<ActionBar title="App Icon Demo" android.icon="res://icon" android.iconVisibility="always"></ActionBar>
結果は次のとおりです。
NavigationButtonコンポーネントは、iOSの戻るボタンとAndroidのナビゲーションボタンを共通で抽象化したものです。
<ActionBar title="App Icon Demo">
<NavigationButton text="Go Back" android.systemIcon="ic_menu_back" tap="onNavBtnTap"/>
</ActionBar>
function onNavBtnTap() {
// This code will be called only in Android.
console.log("Navigation button tapped!");
}
exports.onNavBtnTap = onNavBtnTap;
export function onNavBtnTap(){
// This code will be called only in Android.
console.log("Navigation button tapped!");
}
結果は次のとおりです。
ボタンのデフォルトのテキストは、前のページのタイトルです。「テキストタイトルの設定」のtextの例に示すように、プロパティを設定することで変更できます。 iOSでは、戻るボタンはナビゲーションに明示的に使用されます。 このボタンは前のページに移動し、この動作をオーバーライドするようなタップイベントを記述することはできません。 ActionBarの左側にボタンを配置し、タップイベントを処理させる(スライドアウトを表示するなど)場合は、 ActionItemにios.position="left"を記述してください。
Androidでは、ナビゲーションボタン内にテキストを設定できません。
アイコンプロパティを使用して画像を設定できます(例:~\images\nav-image.png
または res:\\ic_nav
)。
また、android.systemIconを使用して、Androidで使用可能なシステムアイコンの1つを設定できます。
この場合、NavigationButtonタップイベントのデフォルトの動作はないため、実行されるコールバック関数を手動で定義する必要があります。
actionItemsコレクションを使用して追加のアクションボタンを定義できます。
<ActionBar title="Action Items">
<ActionItem tap="onShare"
ios.systemIcon="9" ios.position="left"
android.systemIcon="ic_menu_share" android.position="actionBar"></ActionItem>
<ActionItem tap="onDelete"
ios.systemIcon="16" ios.position="right"
text="delete" android.position="popup"></ActionItem>
</ActionBar>
function onShare(args) {
console.log("Share action item tapped.");
}
exports.onShare = onShare;
function onDelete(args) {
console.log("Delete action item tapped.");
}
exports.onDelete = onDelete;
export function onShare(args: observable.EventData) {
console.log("Share action item tapped.");
}
export function onDelete(args: observable.EventData) {
console.log("Delete action item tapped.");
}
結果は次のとおりです。
次の配置オプションは、iOSおよびAndroidで使用できます。
Android(android.positionで設定):
actionBar
[デフォルト]:アクションバーにアイテムを配置します。アクションアイテムは、テキストまたはアイコンの両方としてレンダリングできます。popup
:アイテムをオプションメニューに配置します。アイテムはテキストとしてレンダリングされます。actionBarIfRoom
:項目に余裕がある場合、項目をActionBarに配置します。それ以外の場合は、オプションメニューに配置します。iOS(ios.positionで設定):
left
[デフォルト]:アイテムをActionBarの左側に配置します。right
:アイテムをActionBarの右側に配置します。iconプロパティを使用して、アクション項目のテキストの代わりに画像を設定できます。
ローカル画像(例:~/images/add.png
)またはリソース(例:res://ic_add
)を使用できます。
アイコンの幅と高さを明示的に設定する方法はないため、推奨されるアプローチはリソースの使用です。
android.systemIconおよびios.systemIconプロパティを使用して、システムアイコンを表示できます。 システムアイコンを定義すると、アイコンとテキストプロパティの代わりにシステムアイコンが使用されます。
android.systemIconの値は、組み込みのAndroidシステムアイコンのリソース名に対応しています。 Androidの表記可能な完全なリストについては、Android Developer Siteにアクセスしてください。
ios.systemIconの値は、"UIBarButtonSystemItem"列挙体の数値です。
値 | アイコン | 値 | アイコン |
---|---|---|---|
0 | Done | 12 | Search |
1 | Cancel | 13 | Refresh |
2 | Edit | 14 | Stop |
3 | Save | 15 | Camera |
4 | Add | 16 | Trash |
5 | FlexibleSpace | 17 | Play |
6 | FixedSpace | 18 | Pause |
7 | Compose | 19 | Rewind |
8 | Reply | 20 | FastForward |
9 | Action | 21 | Undo |
10 | Organize | 22 | Redo |
11 | Bookmarks | 23 | PageCurl |
PageのactionBarHiddenプロパティを設定することで、ActionBarの可視性を明示的に制御できます。
XMLでActionBarを非表示にします。
<Page actionBarHidden="true" loaded="onPageLoaded">
</Page>
コードビハインドでActionBarを非表示にします(TypeScript)。
export function onPageLoaded(args: EventData) {
const page = <Page>args.object;
page.actionBarHidden = true;
}
Androidではアプリケーションバーはデフォルトで表示され、タイトルなどのアプリケーションの名前が表示されます。 ナビゲーションボタンは、アプリケーションで明示的に定義されている場合にのみ表示されます。
iOS、アプリケーションバーが空の場合(たとえば、タイトルやアクションアイテムが定義されていない場合)、最初のページで非表示になり、 ナビゲーションボタンをホストするためのナビゲーション後に自動的に表示されます。 ActionBarが空でない場合(たとえば、タイトルまたはアクションアイテムが定義されている場合)、最初のページにも表示されます。
ActionItemのvisibilityプロパティを使用して、アイテムを動的に非表示および表示できます。可視性にバインディングを使用することもできます。
アプリが「editing」モードのときにさまざまなアクションアイテムを表示する例を次に示します。
<ActionBar title="Action Items Visibility">
<ActionItem tap="onEdit" ios.systemIcon="2" android.systemIcon="ic_menu_edit" ios.position="right"
visibility="{{ isEditing ? 'collapse' : 'visible' }}"/>
<ActionItem tap="onSave" ios.systemIcon="3" android.systemIcon="ic_menu_save" ios.position="right"
visibility="{{ isEditing ? 'visible' : 'collapse' }}"/>
<ActionItem tap="onCancel" ios.systemIcon="1" android.systemIcon="ic_menu_close_clear_cancel"
visibility="{{ isEditing ? 'visible' : 'collapse' }}"/>
</ActionBar>
var observable = require("tns-core-modules/data/observable");
function onLoaded(args) {
var page = args.object;
page.bindingContext = new observable.Observable();
page.bindingContext.set("isEditing", false);
}
exports.onLoaded = onLoaded;
function onEdit(args) {
console.log("Edit item tapped.");
var btn = args.object;
btn.bindingContext.set("isEditing", true);
}
exports.onEdit = onEdit;
function onSave(args) {
console.log("Save item tapped.");
var btn = args.object;
btn.bindingContext.set("isEditing", false);
}
exports.onSave = onSave;
function onCancel(args) {
console.log("Cancel item tapped.");
var btn = args.object;
btn.bindingContext.set("isEditing", false);
}
exports.onCancel = onCancel;
import { EventData, Observable } from "tns-core-modules/data/observable";
import { View } from "tns-core-modules/ui/core/view";
export function onLoaded(args: EventData) {
let page = <View>args.object;
page.bindingContext = new Observable();
page.bindingContext.set("isEditing", false);
}
export function onEdit(args: observable.EventData) {
console.log("Edit item tapped.");
let btn = <view.View>args.object;
btn.bindingContext.set("isEditing", true);
}
export function onSave(args: observable.EventData) {
console.log("Save item tapped.");
let btn = <view.View>args.object;
btn.bindingContext.set("isEditing", false);
}
export function onCancel(args: observable.EventData) {
console.log("Cancel item tapped.");
let btn = <view.View>args.object;
btn.bindingContext.set("isEditing", false);
}
結果は次のとおりです。
ActionBarには、CSSスタイルの制限がいくつかあります。使用できるプロパティは、background-colorとcolorのみです。以下に例を示します。
<ActionBar title="ActionBar Style">
<NavigationButton text="Go Back" android.systemIcon="ic_menu_back"></NavigationButton>
<ActionItem ios.systemIcon="2" android.systemIcon="ic_menu_edit" ios.position="right"></ActionItem>
</ActionBar>
ActionBar {
background-color: #3C5AFD;
color: white;
}
結果は次のとおりです。
iOSでは、colorプロパティはタイトルとアクションアイテムの色に影響します。
Androidでは、colorプロパティはタイトルテキストのみに影響します。
ただし、Androidテーマ(App_Resources\Android\values\styles.xml
内)にactionMenuTextColorAndroidアイテムを追加することにより、
アクションアイテムのテキストのデフォルトの色を設定できます。
この例は、「サイドドロワーボタンを表示する」機能を実装する方法を示しています。
Androidの場合、この例ではNavigationButtonを使用します。 理由はActionItemsがActionBarの右側に表示されるためです。
iOSの場合、このコードは、位置が左に設定された通常のActionItemを追加します。 iOSでNavigationButtonをサイドドロワーボタンとして使用することはできません。 この機能は、常にアプリケーション内で「戻る」として機能します。
<ActionBar title="SideDrawer Button">
<android>
<NavigationButton icon="res://ic_menu" tap="showSideDrawer" />
</android>
<ios>
<ActionItem icon="res://ic_menu" ios.position="left" tap="showSideDrawer" />
</ios>
</ActionBar>
function showSideDrawer(args) {
console.log("Show SideDrawer tapped.");
// Show sidedrawer ...
}
exports.showSideDrawer = showSideDrawer;
export function showSideDrawer(args: observable.EventData) {
console.log("Show SideDrawer tapped.");
// Show sidedrawer ...
}
ActionBar {
background-color: #3C5AFD;
color: white;
}
結果は次のとおりです。