NoClassDefFoundError: Ошибка разрешения: Landroid/support/v7/appcompat/R$styleable
Новичок пытается закончить учебник My first App, предоставленный Google. На пути к этому фатальному исключению я импортировал много случайных пакетов, чтобы избавиться от ошибок "невозможно решить" для ряда вещей, ActionBarActivity, EditText, Fragment, LayoutInflater и т. Д., Но не уверен, что это имеет значение. В любом случае, мое приложение вылетает и выдает фатальное исключение, когда я нажимаю кнопку "Отправить" в главном действии. Вот мой код и файл logcat.
MyActivity.java (он же MainActivity.java из учебного пособия)
package magiccoupons.tutapp;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
public class MyActivity extends Activity {
public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.my, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/** Called when the user clicks the Send button */
public void sendMessage(View view) {
// Do something in response to button
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
}
}
DisplayMessageActivity.java:
package magiccoupons.tutapp;
import android.widget.*;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.*;
import android.support.v7.app.ActionBarActivity;
import android.app.Fragment;
public class DisplayMessageActivity extends ActionBarActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get the message from the intent
Intent intent = getIntent();
String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE);
// Create the text view
TextView textView = new TextView(this);
textView.setTextSize(40);
textView.setText(message);
// Set the text view as the activity layout
setContentView(textView);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() { }
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.activity_display_message,
container, false);
return rootView;
}
}
*/
}
build.gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 'android-L'
buildToolsVersion '20'
defaultConfig {
applicationId "magiccoupons.tutapp"
minSdkVersion 20
targetSdkVersion 20
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-v4:20.0.0'
//compile 'com.android.support:appcompat-v7:21.0.0-rc1'
}
activity_my.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="magiccoupons.tutapp.MainActivity">
<EditText android:id="@+id/edit_message"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="@string/edit_message" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send"
android:onClick="sendMessage" />
</LinearLayout>
activity_display_message.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="magiccoupons.tutapp.DisplayMessageActivity">
<TextView
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
и logcat:
08-21 11:24:36.088 3645-3645/magiccoupons.tutapp I/Process﹕ Sending signal. PID: 3645 SIG: 9
08-21 11:37:33.584 4149-4149/magiccoupons.tutapp W/Resources﹕ Preloaded drawable resource #0x1080093 (android:drawable/sym_def_app_icon) that varies with configuration!!
08-21 11:37:33.676 4149-4149/magiccoupons.tutapp I/am_on_resume_called﹕ [0,magiccoupons.tutapp.MyActivity]
08-21 11:37:33.905 4149-4149/magiccoupons.tutapp D/gralloc_goldfish﹕ Emulator without GPU emulation detected.
08-21 11:37:38.139 4149-4149/magiccoupons.tutapp I/am_on_paused_called﹕ [0,magiccoupons.tutapp.MyActivity]
08-21 11:37:38.218 4149-4149/magiccoupons.tutapp I/Choreographer﹕ Skipped 75 frames! The application may be doing too much work on its main thread.
08-21 11:37:38.356 4149-4149/magiccoupons.tutapp D/AndroidRuntime﹕ Shutting down VM
08-21 11:37:38.369 4149-4149/magiccoupons.tutapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: magiccoupons.tutapp, PID: 4149
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v7/appcompat/R$styleable;
at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:106)
at android.support.v7.app.ActionBarActivityDelegateICS.onCreate(ActionBarActivityDelegateICS.java:57)
at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:99)
at magiccoupons.tutapp.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:15)
at android.app.Activity.performCreate(Activity.java:5720)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1102)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2208)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2317)
at android.app.ActivityThread.access$800(ActivityThread.java:143)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5070)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:631)
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v7.appcompat.R$styleable" on path: DexPathList[[zip file "/data/app/magiccoupons.tutapp-1.apk"],nativeLibraryDirectories=[/data/app-lib/magiccoupons.tutapp-1, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:106)
at android.support.v7.app.ActionBarActivityDelegateICS.onCreate(ActionBarActivityDelegateICS.java:57)
at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:99)
at magiccoupons.tutapp.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:15)
at android.app.Activity.performCreate(Activity.java:5720)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1102)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2208)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2317)
at android.app.ActivityThread.access$800(ActivityThread.java:143)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5070)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:631)
Suppressed: java.lang.ClassNotFoundException: android.support.v7.appcompat.R$styleable
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 18 more
Caused by: java.lang.NoClassDefFoundError: Class "Landroid/support/v7/appcompat/R$styleable;" not found
... 22 more
Извините, если я что-то пропустил и этот вопрос совершенно не нужен и / или дурак. Благодарю.
2 ответа
Вы получаете эту ошибку по следующим причинам:
В вашем файле сборки Gradle ваше приложение нацелено и компилируется с бета-версией Android, которая все еще находится в разработке с:
compileSdkVersion 'android-L'
buildToolsVersion '20'
так же как
minSdkVersion 20
targetSdkVersion 20
Первое, что нужно отметить, это то, что это приложение не будет работать правильно (в настоящее время) ни на одном устройстве, на которое не был установлен Android-L.
Настоящая суть вашей проблемы в DisplayMessageActivity, она распространяется через наследование [ActionBarActivity]:( https://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html) это одна из библиотек поддержки классы для AppCompat.
Чтобы это исправить, измените ваш min SDK на 10 (или 14, который является сэндвичем с мороженым), ваш максимальный SDK на 19 (Kit Kat) и снимите комментарий с библиотеки appcompat-v7 в ваших зависимостях.
В качестве примечания, когда вы объявляете виджеты в их соответствующих действиях / фрагментах, обычно хорошей практикой является их область действия вне каких-либо методов:
EditText editText;
Button sendMessageButton;
// Then in your onCreate() method
editText = (EditText) findViewById(R.id.editText);
sendMessageButton = (Button) findViewById(R.id.sendMessageButton);
Это помогает уменьшить перераспределение памяти и сделать ваш код немного более читабельным. Иногда вам, возможно, придется немного изменить правила, но это обычная практика.
Просто Build->Clean Project
,
а потом Build->Rebuild Project
,
Это все.
Я удалил папку "build" в папке "yourAppName\app"
и все работало нормально. Если вышеуказанное решение не сработало, попробуйте это. папка build будет автоматически сгенерирована при повторной сборке проекта.
В моем случае проблема возникла в Android Studio 4.0. Я полагаю, что с кешем Gradle что-то не так.
К сожалению, ни Invalidate Сaches / Restart
, ни Build -> Clean Project
& Build -> Rebuild Project
не помогло, поэтому пришлось принять решительные меры.
Закройте Android Studio.
Откройте Терминал и перейдите в корневой каталог вашего проекта.
Удалите каталоги сборки всех модулей Gradle, чтобы все модули были скоро перекомпилированы.
find . -wholename "*/build" -exec rm -rf {} \;
Но если у вас один модуль, то просто:
rm -rf app/build
Очистить кеш Gradle. По умолчанию он находится в вашем домашнем каталоге.
rm -rf ~/.gradle
Снова откройте Android Studio. Начнется сборка проекта. Это займет много времени, так как мы только что удалили кеш, но проблема должна быть решена.
В моем случае у меня был макет, который был определен для 720p, но не определен для разрешений по умолчанию, поэтому он падал. Добавление этого файла макета исправило эту проблему, logcat не лгут.