Android Fragments 无法示例化appComponentFactory

vwoqyblh  于 2022-11-24  发布在  Android
关注(0)|答案(2)|浏览(316)

我正在Android Studio中开发一个Android应用程序,我正在努力让我的新片段显示出来。在logcat中,我看到了一个错误,但我不确定这意味着什么,也无法在其他地方找到这个问题的答案。我不确定我是否在尝试设置这个片段时犯了其他错误。
我试过只通过编程方式添加片段,但在YouTube上找到了其他将片段添加到XML的例子,所以我也试过,但也没有成功。我已经尝试了几天,所以任何帮助都将非常感谢。
我尝试使用fragmentTransaction.add和fragmentTransaction.replace启动新片段,但没有区别。
这里是主类

public class Dashboard extends AppCompatActivity {

    Button menuButton;

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

        menuButton = (Button) findViewById(R.id.menu_button);

        menuButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                startClassMenu();

            }
        });
    }

    public void startClassMenu(){

        Fragment classMenuFragment = new ClassMenuFragment();
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.class_menu_fragment_place, classMenuFragment);
        fragmentTransaction.commit();
    }
}

下面是主类xml

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginStart="0dp"
    android:layout_marginLeft="0dp"
    android:layout_marginTop="0dp"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    android:theme="?attr/actionBarTheme" />

<Button
    android:id="@+id/menu_button"
    android:layout_width="40dp"
    android:layout_height="34dp"
    android:layout_alignParentStart="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginStart="21dp"
    android:layout_marginLeft="21dp"
    android:layout_marginTop="82dp"
    android:background="@drawable/icon_blue_menu" />

<Button
    android:id="@+id/home_button"
    android:layout_width="40dp"
    android:layout_height="38dp"
    android:layout_alignParentTop="true"
    android:layout_alignParentEnd="true"
    android:layout_alignParentRight="true"
    android:layout_marginTop="6dp"
    android:layout_marginEnd="16dp"
    android:layout_marginRight="16dp"
    android:background="@drawable/home_icon" />

<Button
    android:id="@+id/settings_button"
    android:layout_width="37dp"
    android:layout_height="33dp"
    android:layout_alignBottom="@+id/menu_button"
    android:layout_alignParentEnd="true"
    android:layout_alignParentRight="true"
    android:layout_marginEnd="100dp"
    android:layout_marginRight="100dp"
    android:layout_marginBottom="72dp"
    android:background="@drawable/icon_settings" />

<fragment
    android:id="@+id/class_menu_fragment_place"
    android:name="teamingenium.ingeniummobileapplication.fragments.ClassMenuFragment"
    android:layout_width="177dp"
    android:layout_height="187dp"
    android:layout_alignEnd="@+id/menu_button"
    android:layout_alignParentTop="true"
    android:layout_marginTop="135dp"
    android:layout_marginEnd="-127dp" />

下面是Java类的片段

public class ClassMenuFragment extends Fragment {

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){

    View view = inflater.inflate(R.layout.fragment_class_menu, container, false);

    return view;

}
}

下面是片段xml类。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
    tools:context=".fragments.ClassMenuFragment"
     android:id="@+id/fragment_class_menu">

<TextView
    android:id="@+id/fragment_class_menu_text_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:text="Fragment Started" />

</FrameLayout>

下面是来自logcat的错误

2018-12-29 20:09:48.405 1925-1925/system_process E/LoadedApk: Unable to instantiate appComponentFactory
    java.lang.ClassNotFoundException: Didn't find class "android.support.v4.app.CoreComponentFactory" on path: DexPathList[[],nativeLibraryDirectories=[/system/priv-app/GoogleSdkSetup/lib/x86, /system/lib, /system/lib]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    at android.app.LoadedApk.createAppFactory(LoadedApk.java:226)
    at android.app.LoadedApk.updateApplicationInfo(LoadedApk.java:338)
    at android.app.ActivityThread.handleDispatchPackageBroadcast(ActivityThread.java:5388)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1733)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at com.android.server.SystemServer.run(SystemServer.java:454)
    at com.android.server.SystemServer.main(SystemServer.java:294)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:838)
628mspwn

628mspwn1#

参考该链路fragment;
由于您在布局xml中使用了<fragment,因此无需调用startClassMenu(),只需删除startClassMenu()方法并重试即可。
尝试其他两种方法:
1、尽量使用android.app.Fragmentandroid.app.FragmentManagerandroid.app.Activity代替使用支持库。
2、尝试在proguard-rules.pro文件中添加-keep public class * extends android.support.v4.**

krugob8w

krugob8w2#

试试这些
检查这个“DexPathList”后,肯定是由于Dexes。
multidex增加了方法的数量
The Dalvik Executable specification limits the total number of methods that can be referenced within a single DEX file to 65,536
此错误可能是由于同时使用androidx和旧版android支持库而导致的
只需打开项目结构,转到“依赖项”,选择“所有模块”,然后检查是否存在包含android.support的库
只需替换为该库的androidx版本即可
如果仍然存在该问题,则
请尝试以下方法解决此问题

dependencies {
    def multidex_version = "2.0.1"
    implementation "androidx.multidex:multidex:$multidex_version"
}

在最新版本的android studio中,如果清单文件中有这些行,则仅为REMOVE

<application
...
tools:replace="android:appComponentFactory"  // REMOVE THIS
android:appComponentFactory="androidx"       // REMOVE THIS
>

检查此行

defaultConfig {
        ...
        multiDexEnabled true
    }

将此行添加到您的MainActivity.kt中

class MyApplication : Application() {

    override fun attachBaseContext(base: Context) {
        super.attachBaseContext(base)
        MultiDex.install(this)  //ADD THIS
    }
}

将其添加到proguard-rules.pro文件中

-keep class com.example.** { *; }

在此验证

buildTypes {
        dev{
            minifyEnabled false
             }
        release {
            minifyEnabled true
             }
    }

在最新版本的android studio中没有instant run禁用选项
现在android studio需要8以上的jdk版本,所以NO NEED来添加这个

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
    jvmTarget = "1.8"
}

相关问题