Я недавно перешел из библиотек поддержки / сравнения v4 в androidx, и хотя он, кажется, работает нормально (по крайней мере, на любом устройстве / эмуляторе, на котором я его запускаю), некоторые пользователи, похоже, испытывают сбой. Я не могу гарантировать , что это связано с миграцией androidx, но это подозрительное время.
Вот трассировка стека аварии (FileActivity.java
- моя операция запуска):
java.lang.RuntimeException:
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2473)
at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2541)
at android.app.ActivityThread.access$800 (ActivityThread.java:160)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1321)
at android.os.Handler.dispatchMessage (Handler.java:102)
at android.os.Looper.loop (Looper.java:135)
at android.app.ActivityThread.main (ActivityThread.java:5597)
at java.lang.reflect.Method.invoke (Method.java)
at java.lang.reflect.Method.invoke (Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:984)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:779)
Caused by: android.view.InflateException:
at android.view.LayoutInflater.createViewFromTag (LayoutInflater.java:761)
at android.view.LayoutInflater.rInflate (LayoutInflater.java:810)
at android.view.LayoutInflater.rInflate (LayoutInflater.java:813)
at android.view.LayoutInflater.inflate (LayoutInflater.java:508)
at android.view.LayoutInflater.inflate (LayoutInflater.java:415)
at android.view.LayoutInflater.inflate (LayoutInflater.java:365)
at androidx.appcompat.app.AppCompatDelegateImpl.setContentView (AppCompatDelegateImpl.java:555)
at androidx.appcompat.app.AppCompatActivity.setContentView (AppCompatActivity.java:161)
at com.me.myapp.FileActivity.onCreate (FileActivity.java:104)
at android.app.Activity.performCreate (Activity.java:6010)
at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1122)
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2426)
at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2541)
at android.app.ActivityThread.access$800 (ActivityThread.java:160)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1321)
at android.os.Handler.dispatchMessage (Handler.java:102)
at android.os.Looper.loop (Looper.java:135)
at android.app.ActivityThread.main (ActivityThread.java:5597)
at java.lang.reflect.Method.invoke (Method.java)
at java.lang.reflect.Method.invoke (Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:984)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:779)
Caused by: java.lang.ClassNotFoundException:
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.view.LayoutInflater.createView(LayoutInflater.java:575)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:747)
... 21 more
и место преступления:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file);
...
Итак, насколько я понимаю, не удается найти класс, когда раздувает макет activity_file
, который находится здесь:
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/toolbar"
layout="@layout/toolbar"/>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/toolbar">
<ListView
android:id="@+id/listView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_below="@+id/toolbar"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:choiceMode="singleChoice"
android:clickable="true"
android:clipToPadding="false"
android:divider="@color/divider"
android:dividerHeight="1dp"
android:focusable="true"
android:focusableInTouchMode="true"
android:headerDividersEnabled="true"
android:longClickable="true"
android:minHeight="64dp"
android:paddingBottom="72sp"
android:scrollingCache="false"
android:stackFromBottom="false"/>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<TextView
android:id="@+id/no_documents"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="false"
android:focusable="false"
android:gravity="center_vertical|center_horizontal"
android:text="@string/no_documents_found"
android:textSize="24sp"
android:textStyle="bold"
android:visibility="visible"/>
<ProgressBar
android:id="@+id/progressBar"
style="@android:style/Widget.DeviceDefault.Light.ProgressBar.Large"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerInParent="true"
android:foregroundGravity="center_vertical|center_horizontal"
android:visibility="invisible"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/floatingActionButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="16dp"
android:clickable="true"
android:focusable="true"
android:maxWidth="24dp"
android:maxHeight="24dp"
app:backgroundTint="@color/colorPrimary"
app:fabSize="normal"
app:srcCompat="@drawable/fab_plus" />
</RelativeLayout>
<com.google.android.material.navigation.NavigationView
android:id="@+id/navigation_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/drawer_header"
app:menu="@menu/file_menu"/>
</androidx.drawerlayout.widget.DrawerLayout>
И, для хорошей меры, ссылочные макеты toolbar
и drawer_header
:
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
android:elevation="4dp">
</androidx.appcompat.widget.Toolbar>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="96dp"
android:background="@drawable/drawer_background"
android:orientation="vertical"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/documents"
android:scaleType="centerCrop"
android:visibility="gone"
app:srcCompat="@drawable/drawer_wallpaper"/>
<ImageView
android:id="@+id/avatar"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_margin="@dimen/spacing_large"
android:elevation="4dp"
android:src="@drawable/ic_launcher"/>
</RelativeLayout>
И (по запросу) file_menu
:
<?xml version="1.0" encoding="utf-8"?>
<menu 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" tools:context=".FileActivity">
<group android:id="@+id/documents">
<item
android:id="@+id/action_documents"
android:checkable="true"
android:checked="true"
android:icon="@drawable/blank"
android:title="@string/documents"/>
</group>
<group android:id="@+id/source">
<item
android:id="@+id/action_googledrive"
android:icon="@drawable/googledrive"
android:title="@string/googledrive"/>
<item
android:id="@+id/action_dropbox"
android:icon="@drawable/dropbox"
android:title="@string/dropbox"/>
<item
android:id="@+id/action_onedrive"
android:icon="@drawable/onedrive"
android:title="@string/onedrive"/>
<item
android:id="@+id/action_device"
android:icon="@drawable/device"
android:title="@string/device_storage"/>
</group>
<group android:id="@+id/settings">
<item
android:id="@+id/action_settings"
android:icon="@drawable/gear"
android:title="@string/action_settings"/>
<item
android:id="@+id/action_upgrade"
android:icon="@drawable/upgrade"
android:title="@string/action_upgrade_now"/>
</group>
<group android:id="@+id/recover">
<item
android:id="@+id/action_recover"
android:icon="@drawable/blank"
android:title="@string/recover"/>
</group>
<item
android:id="@+id/action_help"
android:icon="@drawable/help"
android:title="@string/action_help"/>
<item
android:id="@+id/action_about"
android:icon="@drawable/blank"
android:title="@string/action_about"/>
</menu>
Isчто-то здесь, что я пропускаю, что вызвало бы сбой только на некоторых устройствах? Как, возможно, в более ранних версиях Android?
(Создание этого возможно более сложного факта заключается в том, что некоторые другие пользователи, похоже, получают сбой при запуске, когда отчет включает только java.lang.RuntimeException
, ибольше не "вызвано" трассировкой стека. Я не знаю, связано ли это, но обо всем по порядку.)