Xamarin.Android 中的浮动操作按钮无法激活 JNI 句柄异常
Could not activate JNI Handle exception with Floating action button in Xamarin.Android
我正在尝试使用 xamarin component 在我的应用程序中集成 FloatingActionButton。在布局 inflation 上它抛出异常 "Could not activate JNI Handle 0xffb8b288 (key_handle 0x3ee746ea) of Java type 'com/refractored/fab/FloatingActionButton' as managed type 'com.refractored.fab.FloatingActionButton'."
布局文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fab="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.refractored.fab.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:layout_margin="16dp"
android:src="@drawable/ic_edit"
fab:fab_colorNormal="@color/primary"
fab:fab_colorPressed="@color/primary_pressed"
fab:fab_colorRipple="@color/ripple" />
</FrameLayout>
Activity代码:
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Support.V4.App;
using ActionBar = Android.Support.V7.App.ActionBar;
using Android.Text;
using com.refractored.fab;
using Android.Support.V7.App;
namespace SampleActionBar
{
[Activity (Label = "SampleActionBar", MainLauncher = true, Icon = "@mipmap/icon")]
public class MainActivity : ActionBarActivity, ActionBar.ITabListener
{
protected override void OnCreate (Bundle savedInstanceState)
{
base.OnCreate (savedInstanceState);
InitActionBar ();
}
private void InitActionBar()
{
if (SupportActionBar == null)
return;
var actionBar = SupportActionBar;
actionBar.NavigationMode = (int)ActionBarNavigationMode.Tabs;
var tab1 = actionBar.NewTab();
tab1.SetTabListener(this);
tab1.SetText("ListView");
actionBar.AddTab(tab1);
}
public void OnTabReselected(ActionBar.Tab tab, Android.Support.V4.App.FragmentTransaction ft)
{
}
public void OnTabSelected(ActionBar.Tab tab, Android.Support.V4.App.FragmentTransaction ft)
{
switch (tab.Text)
{
case "ListView":
ft.Replace(Android.Resource.Id.Content, new ListViewFragment());
break;
}
}
public void OnTabUnselected(ActionBar.Tab tab, Android.Support.V4.App.FragmentTransaction ft)
{
}
}
public class ListViewFragment:Android.Support.V4.App.Fragment, IScrollDirectorListener, AbsListView.IOnScrollListener
{
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
var root = inflater.Inflate(Resource.Layout.Main, container, false);
var list = root.FindViewById<ListView>(Android.Resource.Id.List);
var adapter = new ListViewAdapter(Activity, Resources.GetStringArray(Resource.Array.countries));
list.Adapter = adapter;
var fab = root.FindViewById<FloatingActionButton>(Resource.Id.fab);
//fab.AttachToListView(list, this, this);
fab.Click += (sender, args) =>
{
Toast.MakeText(Activity, "FAB Clicked!", ToastLength.Short).Show();
};
return root;
}
public void OnScrollDown()
{
}
public void OnScrollUp()
{
}
public void OnScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
}
public void OnScrollStateChanged(AbsListView view, ScrollState scrollState)
{
}
}
}
目标 sdk 版本为 23,最低版本为 16。
更新 android 支持 V4,V7 AppCompat(23.1.1.0) 和 refractored.fab(1.4.0) 包。
来自 xamarin 组件的示例代码工作正常,没有任何问题
此异常的原因可能是什么?任何 suggestion/hints 都表示赞赏。
谢谢
该组件已被弃用,转而使用 FloatingActionButton
的支持库版本。您可以删除该组件并确保包含来自 Nuget (23.1.1.0) 的最新设计库包 Nuget Link。那么你应该可以做到以下几点。
<android.support.design.widget.FloatingActionButton
...
android:id="@+id/fab" />
在你的代码中加上这个
using Android.Support.Design.Widget;
我正在尝试使用 xamarin component 在我的应用程序中集成 FloatingActionButton。在布局 inflation 上它抛出异常 "Could not activate JNI Handle 0xffb8b288 (key_handle 0x3ee746ea) of Java type 'com/refractored/fab/FloatingActionButton' as managed type 'com.refractored.fab.FloatingActionButton'."
布局文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fab="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.refractored.fab.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:layout_margin="16dp"
android:src="@drawable/ic_edit"
fab:fab_colorNormal="@color/primary"
fab:fab_colorPressed="@color/primary_pressed"
fab:fab_colorRipple="@color/ripple" />
</FrameLayout>
Activity代码:
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Support.V4.App;
using ActionBar = Android.Support.V7.App.ActionBar;
using Android.Text;
using com.refractored.fab;
using Android.Support.V7.App;
namespace SampleActionBar
{
[Activity (Label = "SampleActionBar", MainLauncher = true, Icon = "@mipmap/icon")]
public class MainActivity : ActionBarActivity, ActionBar.ITabListener
{
protected override void OnCreate (Bundle savedInstanceState)
{
base.OnCreate (savedInstanceState);
InitActionBar ();
}
private void InitActionBar()
{
if (SupportActionBar == null)
return;
var actionBar = SupportActionBar;
actionBar.NavigationMode = (int)ActionBarNavigationMode.Tabs;
var tab1 = actionBar.NewTab();
tab1.SetTabListener(this);
tab1.SetText("ListView");
actionBar.AddTab(tab1);
}
public void OnTabReselected(ActionBar.Tab tab, Android.Support.V4.App.FragmentTransaction ft)
{
}
public void OnTabSelected(ActionBar.Tab tab, Android.Support.V4.App.FragmentTransaction ft)
{
switch (tab.Text)
{
case "ListView":
ft.Replace(Android.Resource.Id.Content, new ListViewFragment());
break;
}
}
public void OnTabUnselected(ActionBar.Tab tab, Android.Support.V4.App.FragmentTransaction ft)
{
}
}
public class ListViewFragment:Android.Support.V4.App.Fragment, IScrollDirectorListener, AbsListView.IOnScrollListener
{
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
var root = inflater.Inflate(Resource.Layout.Main, container, false);
var list = root.FindViewById<ListView>(Android.Resource.Id.List);
var adapter = new ListViewAdapter(Activity, Resources.GetStringArray(Resource.Array.countries));
list.Adapter = adapter;
var fab = root.FindViewById<FloatingActionButton>(Resource.Id.fab);
//fab.AttachToListView(list, this, this);
fab.Click += (sender, args) =>
{
Toast.MakeText(Activity, "FAB Clicked!", ToastLength.Short).Show();
};
return root;
}
public void OnScrollDown()
{
}
public void OnScrollUp()
{
}
public void OnScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
}
public void OnScrollStateChanged(AbsListView view, ScrollState scrollState)
{
}
}
}
目标 sdk 版本为 23,最低版本为 16。
更新 android 支持 V4,V7 AppCompat(23.1.1.0) 和 refractored.fab(1.4.0) 包。
来自 xamarin 组件的示例代码工作正常,没有任何问题
此异常的原因可能是什么?任何 suggestion/hints 都表示赞赏。
谢谢
该组件已被弃用,转而使用 FloatingActionButton
的支持库版本。您可以删除该组件并确保包含来自 Nuget (23.1.1.0) 的最新设计库包 Nuget Link。那么你应该可以做到以下几点。
<android.support.design.widget.FloatingActionButton
...
android:id="@+id/fab" />
在你的代码中加上这个
using Android.Support.Design.Widget;