использовать пользовательский вид из проекта библиотеки в моем случае

Я создал проект основной библиотеки для Android, в котором я создал собственный класс представления:

package com.my.android.library.layout;

public class CustomView extends View {
...

Я также определил styleable для своего CustomView:

<?xml version="1.0" encoding="utf-8"?>
<resources>
     <declare-styleable name="CustomView">
        <attr name="title_text" format="string" />
    </declare-styleable>
</resources>

Поскольку я не хочу делиться своим исходным кодом с другими, кто использует мой библиотечный проект, я создал распределенный библиотечный проект, в который я добавил банку указанного выше основного библиотечного проекта< /strong> в папку libs/ проекта распределенной библиотеки и скопировал все ресурсы из проекта основной библиотеки в проект распределенной библиотеки.

ДАЛЕЕ я создал проект приложения для Android, в котором используется проект распределенной библиотеки. В основном файле макета проекта приложения я определил следующее:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

   <com.my.android.library.layout.CustomView
        custom:title_text = "THIS IS TITLE" 
        />
<RelativeLayout>

Когда я запускаю свое приложение, я получаю следующее исключение:

E/AndroidRuntime(30993): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.android.app/com.my.android.app.MainActivity}: android.view.InflateException: Binary XML file line #7: Error inflating class com.my.android.library.layout.CustomView
E/AndroidRuntime(30993):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2071)
E/AndroidRuntime(30993):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2096)
    ...
   Caused by: java.lang.ClassNotFoundException: com.my.android.library.layout.CustomView
E/AndroidRuntime( 2947):    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
E/AndroidRuntime( 2947):    at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
E/AndroidRuntime( 2947):    at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
E/AndroidRuntime( 2947):    at android.view.LayoutInflater.createView(LayoutInflater.java:552)
E/AndroidRuntime( 2947):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)

Кажется, он не может раздуть мой CustomView в макете xml. Почему? Как избавиться от этого?

(Я проверил основной jar-файл библиотеки, там есть класс CustomView. Пожалуйста, не кидайте мне ссылку на сайт Android без объяснения причин.)


comment
Я сказал, что использую проект распределенной библиотеки, что означает, что я сослался на проект библиотеки в своем проекте приложения.   -  person Leem.fin    schedule 07.08.2014
comment
Зачем минусовать мой пост???????   -  person Leem.fin    schedule 07.08.2014
comment
чтение этого developer.android.com/tools/projects/index.html может помощь   -  person Raghunandan    schedule 07.08.2014
comment
@Raghunandan, я не вижу, чтобы эта ссылка отвечала на мой вопрос.   -  person Leem.fin    schedule 07.08.2014
comment
У вас есть конструктор, принимающий 3 параметра в вашем классе CustomView? и у вас есть три разных конструктора?   -  person Illegal Argument    schedule 07.08.2014
comment
@IllegalArgument, нет, у меня есть только один конструктор с Context и AttributeSet, вот что говорится в документе разработчика Android: developer.android.com/training/custom-views/create-view.html   -  person Leem.fin    schedule 07.08.2014
comment
@ Leem.fin, прочитав ваш пост несколько раз, я думаю, что это процесс настройки вашей библиотеки. com.my.android.app/com.my.android.app.MainActivity эта строка заставляет меня так думать. Если показанный пакет будет пакетом вашей библиотеки com.my.android.library.layout.CustomView, тогда ошибка будет другой. Я предполагаю, что код ищет CustomView в com.my.android.app, но я не уверен. Убедитесь, что ваши пути сборки верны   -  person Illegal Argument    schedule 07.08.2014
comment
@Leem.fin, вы можете опубликовать изображение ваших android private library и android depedencies в пути сборки Java   -  person Rod_Algonquin    schedule 11.08.2014
comment
@Leem.fin добавьте android:layout_width и android:layout_height к вашему CustomView и сообщите мне результат. после этого если ClassNotFoundException выкинет скажите.   -  person mmlooloo    schedule 16.08.2014


Ответы (2)


Поскольку вы добавляете представление из банки, вы должны указать пространство имен как:

 xmlns:custom="http://schemas.android.com/apk/lib/root_package_name

Где «root_package_name» может быть «com.my.android.library.layout» или «com.my.android.library» или что-то в этом роде.

Если это не сработает, то, вероятно, проблема в «Заказе и экспорте» или в том, как вы добавляете библиотеку. Убедитесь, что библиотека подключена правильно:

Активность Android ClassNotFoundException - пробовал все

И, наконец, если и это не поможет, вам может потребоваться обновить Android SDK:

ClassNotFoundException: не найден класс com.google.android .gms.ads.Просмотр объявлений

person Jim    schedule 13.08.2014

Попробуем сделать это так:

  public CustomView(Context context) {
    this(context, null, 0);
  }

  public CustomView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public CustomView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    //init your stuff here
  }

Не могли бы вы дать нам полную трассировку стека исключения?

person Peter Moskala    schedule 07.08.2014