Xamarin.Android Binding 源自github第三方库的绑定(中级教学)----aar文件

今天来个稍微复杂一点的源自github的android第三方库:CarouselView

(今天我们依然不用在metadata.xml里面写代码,虽然在build时不会有error出现,但是会有烦人的warning出现,导致我们在dll里面找不到我们需要使用的class)

今天我们就是要解决这个问题,这个问题源自这个项目依赖的库

效果图:

今天我们的任务就是把它从Java整成C#,嘿嘿嘿嘿!!!!

CarouselView的Github地址在这里:https://github.com/sayyam/carouselview

1.首先创建项目:  模板--->Android---->单一视图应用(Android)--->名称:CarouselViewProject

      自己脑补图片0.0

2.CarouselViewProject--->引用(右键)--->Generate Xamarin.Android Bindings via gradle

从GitHub项目得到Gradle:compile ‘com.synnapps:carouselview:0.1.4‘

ok-->ok默认的只勾选第一个aar文件:carouselview-0.1.4.aar剩下的就是这个aar所依赖的jar和aar文件.

3.重新生成项目

你会惊喜的发现,出现不少warning

  warning : Couldn‘t load class com/synnapps/carouselview/CarouselView$1 : java.lang.NoClassDefFoundError: android/support/v4/view/ViewPager$OnPageChangeListener

  什么鬼,这个核心的类,居然无法加载.

4.复制dll文件,然后删除掉自动添加的 绑定库项目 :Binding_CarouselView, 然后在CarouselViewProject项目里引用这个dll文件.

  在引用里,双击Binding_CarouselView,在对象浏览器里,查看Binding_CarouselView,你会发现一件事情,xamarin你欺骗我,我的类呢0.0?????

===============================================================================================

好吧,以上是假教学,下面正式开始今天的教学

===============================================================================================

自己脑补假教学的1.2步骤,我们直接从第3步开始.

如何解决这类waring呢?--warning : Couldn‘t load class com/synnapps/carouselview/CarouselView$1 : java.lang.NoClassDefFoundError: android/support/v4/view/ViewPager$OnPageChangeListener

其实这是一个依赖的问题,你注意到第三张图片里有好多未打勾的aar,jar文件了吗?这就是这个库所依赖的文件.

但是我们并不会打勾这些aar,jar文件,那我们如何引用这些库呢?

3. 其实这些都是android文件,而且Xamarin官方已经帮我们做好了dll文件,我们只需要在解决方案里,为 app,android binding library两个项目添加上这些nuget包即可,同时需要注意nuget包的版本和图三匹配(尽量做到匹配)

Nuget包:

Xamarin.Android.Support.v7.RecyclerView (25.1.0版本)

Xamarin.Android.Support.v7.AppCompat(25.1.0版本)

Xamarin.Android.Support.v4(25.1.0版本)

Xamarin.Android.Support.Annotations(好像并没有25.1.0版本,直接选择最新稳定版即可25.4.0.2)

虽然我们只选择了这四个包安装,但是因为nuget包之间有依赖关系,最终我们会安装上11个nuget包.

4.Build整个解决方案,取走Binding_CarouselView的Binding_CarouselView.dll文件----(文件地址CarouselViewProject\CarouselViewProject\AndroidBindings\Binding_CarouselView\bin\Debug

(保存好这个dll)

 

5.先删除Binding_CarouselView项目,然后在CarouselViewProject项目的引用里添加刚才我们保存的Binding_CarouselView.dll

 

6.一切准备就绪,让我们开始使用这个 Com.Synnapps.Carouselview吧

让我们先看一下github的介绍,或者去sample项目浏览一下Java是怎么做的,然后我们要把它的代码变成C#!

如同周伯通,左手画方,右手画圆.

Github上面的代码,作者是这么写的:

Java版本

Usage

Include following code in your layout:

    <com.synnapps.carouselview.CarouselView
        android:id="@+id/carouselView"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        app:fillColor="#FFFFFFFF"
        app:pageColor="#00000000"
        app:radius="6dp"
        app:slideInterval="3000"
        app:strokeColor="#FF777777"
        app:strokeWidth="1dp"/>


Include following code in your activity:

public class SampleCarouselViewActivity extends AppCompatActivity {

    CarouselView carouselView;

    int[] sampleImages = {R.drawable.image_1, R.drawable.image_2, R.drawable.image_3, R.drawable.image_4, R.drawable.image_5};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sample_carousel_view);

        carouselView = (CarouselView) findViewById(R.id.carouselView);
        carouselView.setPageCount(sampleImages.length);

        carouselView.setImageListener(imageListener);
    }

    ImageListener imageListener = new ImageListener() {
        @Override
        public void setImageForPosition(int position, ImageView imageView) {
            imageView.setImageResource(sampleImages[position]);
        }
    };

}

C#版本

一.我们先找到5张图片放到Resources\drawable文件夹里面.(我直接使用github上面的5张图片)

二.在layout/Main.axml 里面填写以下xml代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
  <com.synnapps.carouselview.CarouselView
      android:id="@+id/myCarouselView"
      android:layout_width="match_parent"
      android:layout_height="200dp"
      app:fillColor="#FFFFFFFF"
      app:pageColor="#00000000"
      app:radius="6dp"
      app:slideInterval="3000"
      app:strokeColor="#FF777777"
      app:strokeWidth="1dp" />
</LinearLayout>

三.在MainActivity.cs填写以下代码

using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Com.Synnapps.Carouselview;

namespace CarouselViewProject
{
    [Activity(Label = "CarouselViewProject", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity, IImageListener
    {
        CarouselView myCarouselView;
        int[] sampleImages = { Resource.Drawable.image_1, Resource.Drawable.image_2, Resource.Drawable.image_3, Resource.Drawable.image_4, Resource.Drawable.image_5 };

        public void SetImageForPosition(int p0, ImageView p1)
        {
            p1.SetImageResource(sampleImages[p0]);
        }

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);
            myCarouselView = (CarouselView)FindViewById<CarouselView>(Resource.Id.myCarouselView);
            myCarouselView.PageCount = sampleImages.Length;
            myCarouselView.SetImageListener(this);
        }
    }
}

四.运行,效果图如下

====================================================================================================

====================================================================================================

让我们接着跟着github作者的步骤走,提升以下难度,这次我们要自定义轮播喽,在图片左上角 增加文字和点击事件

====================================================================================================

====================================================================================================

Java版本:

If you want to add custom view, implement ViewListener.

public class SampleCarouselViewActivity extends AppCompatActivity {

    CarouselView customCarouselView;
    int NUMBER_OF_PAGES = 5;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sample_carousel_view);

        customCarouselView = (CarouselView) findViewById(R.id.customCarouselView);
        customCarouselView.setPageCount(NUMBER_OF_PAGES);
        // set ViewListener for custom view
        customCarouselView.setViewListener(viewListener);
    }

    ViewListener viewListener = new ViewListener() {

        @Override
        public View setViewForPosition(int position) {
            View customView = getLayoutInflater().inflate(R.layout.view_custom, null);
            //set view attributes here

            return customView;
        }
    };

If you‘d like to receive touch events for each image

customCarouselView.setImageClickListener(new ImageClickListener() {
            @Override
            public void onClick(int position) {
                Toast.makeText(SampleCarouselViewActivity.this, "Clicked item: "+ position, Toast.LENGTH_SHORT).show();
            }
        });

 C#版本:

一.layout,右键,添加,新建项,Android布局,view_custom.axml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center">
    <ImageView
        android:id="@+id/fruitImageView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:scaleType="centerCrop" />
    <TextView
        android:id="@+id/labelTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="30dp"
        android:textSize="24sp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:paddingTop="5dp"
        android:paddingBottom="5dp"
        android:background="#44FFFFFF"
        android:fontFamily="sans-serif-thin"
        android:textColor="@android:color/white"/>
</RelativeLayout>

二.修改Main.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.synnapps.carouselview.CarouselView
        android:id="@+id/customCarouselView"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        app:fillColor="#FFFFFFFF"
        app:pageColor="#00000000"
        app:radius="6dp"
        app:slideInterval="3000"
        app:strokeColor="#FF777777"
        app:strokeWidth="1dp" />
</LinearLayout>

三.修改MainActivity.cs

using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Com.Synnapps.Carouselview;

namespace CarouselViewProject
{
    [Activity(Label = "CarouselViewProject", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity, IViewListener, IImageClickListener
    {
        CarouselView customCarouselView;

        int[] sampleImages = { Resource.Drawable.image_1, Resource.Drawable.image_2, Resource.Drawable.image_3, Resource.Drawable.image_4, Resource.Drawable.image_5 };
        String[] sampleTitles = { "Orange", "Grapes", "Strawberry", "Cherry", "Apricot" };

        public void OnClick(int p0)
        {
            Toast.MakeText(ApplicationContext, sampleTitles[p0], ToastLength.Long).Show();
        }

        public View SetViewForPosition(int p0)
        {
            View customView = this.LayoutInflater.Inflate(Resource.Layout.view_custom, null);
            TextView labelTextView = (TextView)customView.FindViewById(Resource.Id.labelTextView);
            ImageView fruitImageView = (ImageView)customView.FindViewById(Resource.Id.fruitImageView);

            labelTextView.Text=sampleTitles[p0];
            fruitImageView.SetImageResource(sampleImages[p0]);

            return customView;
        }

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            customCarouselView = (CarouselView)FindViewById<CarouselView>(Resource.Id.customCarouselView);
            customCarouselView.PageCount = sampleImages.Length;
            customCarouselView.SetViewListener(this);
            customCarouselView.SetImageClickListener(this);
        }
    }
}

效果图:

再见0.0

时间: 2024-10-13 12:48:42

Xamarin.Android Binding 源自github第三方库的绑定(中级教学)----aar文件的相关文章

使用SlidingMenu的方法以及Android Studio 如何导入第三方库SlidingMenu

一.使用SlidingMenu的方法 1.引入SlidingMenu库 2.继承SlidingFragmentActivity 3.onCreate方法改成public 4.调用相关API  二.Android Studio 如何导入第三方库SlidingMenu? 材料:github网站下载的第三方库SlidingMenu-master.zip 步骤: 1.新建一个项目(我的项目是NewsReports) 2.在NewsReports目录下新建一个SlidingMenuLibraries文件夹

Android Studio中导入第三方库

之前开发Android都是使用的eclipse,最近由于和外国朋友Timothy一起开发一款应用,他是从WP平台刚切换使用Android的,使用的开发环境时Android Studio,为了便于项目的交流,我便尝试着去使用Android Studio.刚开始用遇到一个问题:如何在Android Studio中导入第三方库? 首先本人使用的Studio版本为0.5.8,尝试解决方法如下,分两种: 1.导入jar包 直接复制你的jar包(如actiobarsherlock.jar)至工程的libs目

python第三方库学习之xlrd读取Excel文件

因为经常会涉及到从Excel表中导数据,所以就学习了python的xlrd来读取excel中的数据. 1.xlrd的安装 xlrd是python的第三方库,所以是需要自己安装的,可以在python的官网http://pypi.python.org/pypi/xlrd下载该模块来安装,也可以通过其他手段,比如easy_install或者pip啥的,我已经安装好pip所以就用最懒的方式来安装了pip install xlrd来安装. 2.分析excel文件的层级对象 要读取excel的数据,就要了解

得到GitHub第三方库的jar包

伴随着GitHub以及Android Studio的普及,ADT已经越来越少开发者使用了.我们经常Android开发一些非常优秀的 控件,插件,第三方库,使用方式都是 compile 'com.github.nkzawa:engine.io-client:0.6.0' 这个对于使用Android Studio的开发者非常方便的.但是由于历史原因,有部分公司/项目还在使用这ADT这个 开发工具,这个时候就会出现一些求jar包的人,小部分开发第三方工具的人,在提供远程仓库的同时,也会使用 提供jar

进阶篇-用户界面:6.android studio使用github开源库实现下拉刷新

说实话,这是我第一次这么正儿八经的用github开源库,之前一直在听一些大神对这个世界级的开源库赞不绝口,今天终于体会到了.由于下拉刷新的类库是在eclipse下开发完成的,而eclipse如何使用如果导入网上的教程都非常详细.昨天我试了半天发现由于自己对android studio还不是很熟悉,所以引用类库的时候发现无从下手.但是今天早晨起来我唯一想做的事就是一定要实现这个下拉刷新的效果.我去网上找android studio导入类库的教程,导入PullToRefresh的教程,但是网上用的都

Android JNI如何调用第三方库

http://www.2cto.com/kf/201504/388764.html Android JNI找不到第三方库的解决方案 cannot load library 最近做一个jni项目,拿到的so库需要用jni封装一层,等于是在jni的C++代码里调用第三方库的方法,然后整个项目在Android上运行出结果. 自己用jni生成的so是libaa.so 使用的第三方库是libbb.so. 到目前为止,遇到的问题是libbb各种找不到.libbb库去哪儿了? E/AndroidRuntime

快速运行体验github第三方库

Android Studio越来越普及了,平时github上的android 项目基本都是Android Studio工程,看到那么多炫酷的效果,很多时候都想亲子体验一把,有些库已经帮我们打包了apk文件,可以直接下载到手机上体验,还有些开发者很懒,仅仅上传了效果图gif或者静态图片,这时想要体验一些很有趣的效果就不得不下载下来自己运行了,一般直接导入工程会报错,因为gradle版本还有编译版本不同等等原因,很是不爽,通过自己的总结,将问题总结了下,代码还有项目结构基本都一样,运行错误大都是版本

收集-Android快速开发框架、第三方库

在开发过程中,使用一些封装好的框架,可以节约时间,减少代码量. 因为这些框架将常用的功能模块封装好,开发的时候只需简单的代码进行调用. 为了方便工作中的不时之需,特将一些框架及地址收集起来. 以下只是冰山一角,还需继续补充完善. 也希望看到的朋友多提建议,多推荐优秀的框架.先行谢过! --------------------------------------------------------------------------------------- 网络通信: Volley - http

Android Studio CMake依赖第三方库

这里实现一个简单的功能在APP里调用libnative-lib.so里的add.libnative-lib.so去调用libthird.so里的third_add来实现 JniUtil public class JniUtil { static { System.loadLibrary("native-lib"); System.loadLibrary("third"); } public static native int add(int x,int y); }