Fix - nav button with reflection

This commit is contained in:
vakrilov
2015-07-09 13:48:58 +03:00
parent e52b0c4556
commit 5c86e042c1
4 changed files with 59 additions and 29 deletions

View File

@@ -18,3 +18,21 @@ export function buttonTap(args: observable.EventData) {
}
}
var j = 0;
export function visibilityTap(args: observable.EventData) {
var page = <pages.Page>view.getAncestor(<view.View>args.object, "Page")
if (j % 3 === 0) {
page.actionBar.androidIconVisibility = "always";
}
else if (j % 3 === 1) {
page.actionBar.androidIconVisibility = "never";
}
else if (j % 3 === 2) {
page.actionBar.androidIconVisibility = "auto";
}
j++;
console.log("Visibility changed to: " + page.actionBar.androidIconVisibility);
}

View File

@@ -4,5 +4,6 @@
</Page.actionBar>
<StackLayout>
<Button text="button" tap="buttonTap"/>
<Button text="change main icon visibility" tap="visibilityTap"/>
</StackLayout>
</Page>

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -29,7 +29,7 @@ export class ActionBar extends common.ActionBar {
}
}
public _onAndroidItemSelected(itemId: number): boolean{
public _onAndroidItemSelected(itemId: number): boolean {
var menuItem = this.actionItems.getItemAt(itemId - ACTION_ITEM_ID_OFFSET);
if (menuItem) {
menuItem._raiseTap();
@@ -66,34 +66,12 @@ export class ActionBar extends common.ActionBar {
if (navButton) {
// No API to set the icon in pre-lvl 18
if (API_LVL >= 18) {
try {
// TODO: Find a better way to set the icon instead of using reflection
var drawableOrId = getDrawableOrResourceId(navButton.icon, this._appResources);
if (!drawableOrId) {
drawableOrId = 0;
}
var arr, arr2, method;
if (types.isNumber(drawableOrId)) {
arr[0] = java.lang.Integer.TYPE;
method = actionBar.getClass().getMethod("setHomeAsUpIndicator", arr);
arr2 = java.lang.reflect.Array.newInstance(java.lang.Object.class, 1);
arr2[0] = new java.lang.Integer(drawableOrId);
method.invoke(actionBar, arr2);
} else {
arr = java.lang.reflect.Array.newInstance(java.lang.Class.class, 1);
arr[0] = android.graphics.drawable.Drawable.class;
method = actionBar.getClass().getMethod("setHomeAsUpIndicator", arr);
arr2 = java.lang.reflect.Array.newInstance(java.lang.Object.class, 1);
arr2[0] = drawableOrId;
method.invoke(actionBar, arr2);
}
}
catch (e) {
trace.write("Failed to set navigation icon: " + e, trace.categories.Error, trace.messageType.error);
var drawableOrId = getDrawableOrResourceId(navButton.icon, this._appResources);
if (!drawableOrId) {
drawableOrId = 0;
}
setHomeAsUpIndicator(actionBar, drawableOrId);
}
actionBar.setDisplayHomeAsUpEnabled(true);
}
@@ -163,7 +141,40 @@ export class ActionBar extends common.ActionBar {
if (frame.topmost().currentPage === this.page) {
this._updateIcon(frame.topmost().android.actionBar);
}
}
}
}
var setHomeAsUpIndicatorWithResoruceId: java.lang.reflect.Method;
var setHomeAsUpIndicatorWithDrawable: java.lang.reflect.Method;
function setHomeAsUpIndicator(actionBar: android.app.ActionBar, drawableOrId: any) {
try {
// TODO: Remove reflection as soon as AppCopmat libs are available
var paramsArr = java.lang.reflect.Array.newInstance(java.lang.Object.class, 1);
if (types.isNumber(drawableOrId)) {
if (!setHomeAsUpIndicatorWithResoruceId) {
// get setHomeAsUpIndicator(resourceId: number) method with reflection and cache it
let typeArr = java.lang.reflect.Array.newInstance(java.lang.Class.class, 1);
typeArr[0] = java.lang.Integer.TYPE;
setHomeAsUpIndicatorWithResoruceId = actionBar.getClass().getMethod("setHomeAsUpIndicator", typeArr);
}
paramsArr[0] = new java.lang.Integer(drawableOrId);
setHomeAsUpIndicatorWithResoruceId.invoke(actionBar, paramsArr);
} else {
if (!setHomeAsUpIndicatorWithDrawable) {
// get setHomeAsUpIndicator(drawable) method with reflection and cache it
let typeArr = java.lang.reflect.Array.newInstance(java.lang.Class.class, 1);
typeArr[0] = android.graphics.drawable.Drawable.class;
setHomeAsUpIndicatorWithDrawable = actionBar.getClass().getMethod("setHomeAsUpIndicator", typeArr);
}
paramsArr[0] = drawableOrId;
setHomeAsUpIndicatorWithDrawable.invoke(actionBar, paramsArr);
}
}
catch (e) {
trace.write("Failed to set navigation icon: " + e, trace.categories.Error, trace.messageType.error);
}
}
function getDrawableOrResourceId(icon: string, resources: android.content.res.Resources): any {