【问题标题】:Could not activate JNI Handle exception with Floating action button in Xamarin.Android无法使用 Xamarin.Android 中的浮动操作按钮激活 JNI 句柄异常
【发布时间】:2016-04-27 15:40:11
【问题描述】:

我正在尝试使用 xamarin component 将 FloatingActionButton 集成到我的应用程序中。在布局膨胀时,它会引发异常“无法将 Java 类型 'com/refractored/fab/FloatingActionButton' 的 JNI Handle 0xffb8b288 (key_handle 0x3ee746ea) 激活为托管类型 '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>

活动代码:

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 组件的示例代码可以正常工作,没有任何问题
此异常的原因可能是什么?任何建议/提示表示赞赏。
谢谢你

【问题讨论】:

    标签: android xamarin xamarin.android material-design floating-action-button


    【解决方案1】:

    该组件已被弃用,取而代之的是使用FloatingActionButton 的支持库版本。您可以删除该组件并确保包含来自 Nuget (23.1.1.0) 的最新设计库包 Nuget Link。那么您应该能够执行以下操作。

    <android.support.design.widget.FloatingActionButton
      ...
      android:id="@+id/fab" />
    

    在你的代码中使用这个 using Android.Support.Design.Widget;

    【讨论】:

    • 这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 2016-11-26
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    相关资源
    最近更新 更多