Ошибка надувания класса из библиотеки

У меня проблема с классом, который я использую из внешней библиотеки. если быть точным, библиотека futuresimple/android-floating-action-button Я объединил его с девятью андроидами, чтобы иметь возможность использовать его в Android SDK-версиях до 14. Кажется, это работает (библиотека собирается без проблем). Теперь моя проблема в том, что я не могу инициировать FloatingActionMenu. LogCat говорит:

Process: com.packagename, PID: 1531
java.lang.RuntimeException: Unable to start activity     ComponentInfo{com.packagename/com.packagename.MainActivity}: android.view.InflateException: Binary     XML file line #27: Error inflating class com.getbase.floatingactionbutton.FloatingActionsMenu
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
        at android.app.ActivityThread.access$800(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: android.view.InflateException: Binary XML file line #27: Error inflating class com.getbase.floatingactionbutton.FloatingActionsMenu
        at android.view.LayoutInflater.createView(LayoutInflater.java:603)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
        at android.support.v7.app.ActionBarActivityDelegateBase.setContentView(ActionBarActivityDelegateBase.java:228)
        at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:102)
        at com.packagename.MainActivity.onCreate(MainActivity.java:48)
        at android.app.Activity.performCreate(Activity.java:5231)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
            at android.app.ActivityThread.access$800(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
        at java.lang.Class.getConstructorOrMethod(Class.java:472)
        at java.lang.Class.getConstructor(Class.java:446)
        at android.view.LayoutInflater.createView(LayoutInflater.java:568)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
            at android.support.v7.app.ActionBarActivityDelegateBase.setContentView(ActionBarActivityDelegateBase.java:228)
            at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:102)
            at com.packagename.MainActivity.onCreate(MainActivity.java:48)
            at android.app.Activity.performCreate(Activity.java:5231)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
            at android.app.ActivityThread.access$800(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)
12-26 05:06:35.7

1531-1531/com.packagename I/Process﹕ Sending signal. PID: 1531 SIG: 9

Так что, похоже, проблема с конструктором, верно? Вот код (мне тоже пришлось немного переделать):

public FloatingActionsMenu(Context context) {
      super(context, null);
      init(context, null);

  }

  public FloatingActionsMenu(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs);
  }

  public FloatingActionsMenu(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context, attrs);
  }

  public void init(Context context, AttributeSet attributeSet) {
    mButtonSpacing = (int) (getResources().getDimension(R.dimen.fab_actions_spacing) - getResources().getDimension(R.dimen.fab_shadow_radius) - getResources().getDimension(R.dimen.fab_shadow_offset));
    mLabelsMargin = getResources().getDimensionPixelSize(R.dimen.fab_labels_margin);
    mLabelsVerticalOffset = getResources().getDimensionPixelSize(R.dimen.fab_shadow_offset);

    TypedArray attr = context.obtainStyledAttributes(attributeSet, R.styleable.FloatingActionsMenu, 0, 0);
      mAddButtonPlusColor = attr.getColor(R.styleable.FloatingActionsMenu_fab_addButtonPlusIconColor, getColor(android.R.color.white));
      if (Build.VERSION.SDK_INT >= 14 ) {
          mAddButtonColorNormal = attr.getColor(R.styleable.FloatingActionsMenu_fab_addButtonColorNormal, getColor(android.R.color.holo_blue_dark));
          mAddButtonColorPressed = attr.getColor(R.styleable.FloatingActionsMenu_fab_addButtonColorPressed, getColor(android.R.color.holo_blue_light));
      }else{
          mAddButtonColorNormal = attr.getColor(R.styleable.FloatingActionsMenu_fab_addButtonColorNormal, getColor(R.color.holo_blue_dark));
          mAddButtonColorPressed = attr.getColor(R.styleable.FloatingActionsMenu_fab_addButtonColorPressed, getColor(R.color.holo_blue_light));
      }
    mExpandDirection = attr.getInt(R.styleable.FloatingActionsMenu_fab_expandDirection, EXPAND_UP);
    mLabelsStyle = attr.getResourceId(R.styleable.FloatingActionsMenu_fab_labelStyle, 0);
    attr.recycle();

    if (mLabelsStyle != 0 && expandsHorizontally()) {
      throw new IllegalStateException("Action labels in horizontal expand orientation is not supported.");
    }

    createAddButton(context);
  }

Есть все три Конструктора, и функция инициализации общедоступна. Я действительно не вижу ошибку, которую я делаю.

Просто чтобы быть уверенным, что я тоже добавляю свои файлы сборки:

для библиотеки;

apply plugin: 'com.android.library'

android {
    signingConfigs {
        debug {
        }
        release {
            keyAlias 'AppName'
            keyPassword 'android'
            storeFile file('path/to/keystore')
            storePassword 'android'
        }
    }
    compileSdkVersion 21
    buildToolsVersion "21.1.2"
    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled false
            signingConfig signingConfigs.debug
        }
    }
    productFlavors {
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}

dependencies {
    compile files('libs/nineoldandroids-2.4.0.jar')
    compile 'com.android.support:support-annotations:21.0.3'
}

для приложения:

apply plugin: 'com.android.application'

android {
    signingConfigs {
        debug {
        }
        release {
            keyAlias 'AppName'
            keyPassword 'android'
            storeFile file('path/to/keystore')
            storePassword 'android'
        }
    }
    compileSdkVersion 21
    buildToolsVersion "21.1.2"
    defaultConfig {
        applicationId "com.packagename"
        minSdkVersion 9
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled false
            signingConfig signingConfigs.debug
        }
    }
    productFlavors {
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:support-annotations:21.0.3'
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'com.android.support:cardview-v7:21.0.0'
    compile 'com.android.support:gridlayout-v7:21.0.0'
    compile 'com.android.support:support-v4:21.0.3'
    compile 'com.google.android.gms:play-services:6.5.87'
    compile project(':fab')
}

... with: fab - указанная выше настраиваемая библиотека, объявленная в setting.gradle:

include ':app', ':fab'
project(':fab').projectDir = new File('libs/fab')</pre>

Структура каталога библиотеки выглядит следующим образом:

fab
   build
      generated
      intermediates
   libs
      nineoldandroids-2.4.0.jar
   src
      main
         java
            com.getbase.floatingactionbutton
               AddFloatingActionButton
               FloatingActionButton
               FloatinActionsMenu
         res
            drawables and stuff...
         AndroidManifest.xml

Надеюсь, я не забыл важную информацию.

РЕДАКТИРОВАТЬ Похоже, я сделал что-то не так с реализацией библиотеки: я просто попытался инициировать одну кнопку с плавающим действием, но получил следующее сообщение об ошибке сборки:

error: cannot find symbol class FloatingActionButton

Я, конечно, импортировал класс. Мой код выглядит примерно так (другие вещи, которые происходят и работают нормально, не включены):

package com.packagename;

import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.view.Gravity;
import android.view.View;
import android.widget.ExpandableListView;

import com.getbase.floatingactionbutton.FloatingActionButton;


public class MainActivity extends android.support.v7.app.ActionBarActivity
         {

    private android.support.v7.app.ActionBarDrawerToggle mDrawerToggle;

    // used to store app title
    private CharSequence mTitle;


    [...]

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

        mTitle = mDrawerTitle = getTitle();

        Toolbar mToolbar = (Toolbar)findViewById(R.id.toolbar);

        setSupportActionBar(mToolbar);

        [...]

        FloatingActionButton button = (FloatingActionButton) findViewById(R.id.messages_fab);
        button.setSize(FloatingActionButton.SIZE_MINI);
        button.setColorNormalResId(R.color.half_black);
        button.setColorPressedResId(R.color.half_black);
        button.setIcon(R.drawable.ic_action_email);

        if (savedInstanceState == null) {

        }
    }

    [...]
}

4 ответа

Хорошо, теперь я правильно включил эту библиотеку. Этот пост был очень полезным, хотя я уже нашел его, прежде чем сам спросить здесь.

Вот как я решил свою первую проблему (Android Studio 1.0.2):

  • Я добавил библиотеку в свой проект с помощью:

    файл -> новый модуль -> из существующего -> "выбор библиотеки-места назначения" -> конец

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

    файл -> структура проекта -> "нажмите на имя приложения" -> зависимости (справа) -> + -> ": библиотека" (так как это было название каталогов, которое я выбрал)

  • наконец-то мне пришлось работать над файлом settings.gradle, где я изменил:

    include ':app'

в

include ':app', ':library'

Теперь, похоже, библиотека реализована так, как и должна быть. Нет ошибок при запуске приложения, нет сбоев, и я могу добавить кнопку плавающего действия из этой библиотеки.

Теперь моя проблема в том, что мое добавленное меню "Плавающее действие" не отображается, но это еще одна проблема, не имеющая ничего общего с этой теперь решенной проблемой.

Попробуй так:

public FloatingActionsMenu(Context context) {
      super(context);
      init(context, null);

  }
Binary XML file line #27: Error inflating class com.getbase.floatingactionbutton.FloatingActionsMenu

У меня та же проблема. Эта ошибка выглядит как из вашего импорта Gradle. Попробуйте повторно импортировать, а затем аннулировать вашу Android-студию.

Была такая же ошибка. Пожалуйста, очистите ваш xml-файл. У меня был какой-то старый tools:context атрибуты в нем.

Ваш XML должен начать как (примечание xmlns:fab="http://schemas.android.com/tools")...

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

Использование следующего кода (из примера) приведет к сбою моего приложения...

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:fab="http://schemas.android.com/apk/res-auto"
                android:background="@color/background"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

Я думаю, что нет "правильного" способа оказания помощи.:-/

Однако, может быть, это помогает...

Другие вопросы по тегам