从另一个APK加载带有布局的片段

问题描述 投票:0回答:1

我有两个APK。第一个APK是主要的APK,会加载第二个APK。

MainActivity.java(第一个APK):对象mainFragment早已由DexClassLoader加载

setContentView(R.layout.activity_main);

LinearLayout fragContainer = findViewById(R.id.main_fragment);

LinearLayout ll = new LinearLayout(context);
ll.setOrientation(LinearLayout.HORIZONTAL);
ll.setId(View.generateViewId());

getSupportFragmentManager().beginTransaction().add(ll.getId(), mainFragment, "mainFragment").commit();

fragContainer.addView(ll);

activity_main.xml(第一个APK):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" >
    <LinearLayout
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:id="@+id/main_fragment"
            android:orientation="vertical"
            />

</LinearLayout>

MainFragment.java(第二个APK):

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_main, viewGroup, false);

    view.findViewById(R.id.emailSignInButton).setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

        }
    });

    return view;
}

fragment_main.xml(第二个APK):

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    <Button
            android:text="@string/sign_in"
            android:layout_width="88dp"
            android:layout_height="wrap_content"
            android:id="@+id/emailSignInButton"

            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="32dp"
            android:layout_marginEnd="32dp" android:layout_marginTop="8dp"
            tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>

我不明白,为什么要排队

View view = inflater.inflate(R.layout.fragment_main, viewGroup, false);

view始终为NULL。是否需要像R.layout.fragment_main一样将mainFragment加载到内存中?

java android android-fragments layout dynamic-loading
1个回答
0
投票

@@ CommonsWare已经回答您:您正在加载课程,而不是资源。

在Android的软件包中,您同时拥有类(如R)和资源(如经过预处理的XML文件,例如布局)。 ClassLoader能够读取和加载第一个,因此,可以加载另一个的APK R类。但是R的索引仅指向资源文件,它们不包含所述资源的实际值。因此,您旁加载的R类不会提供通往有效资源的路由。如果R可以做到这一点,那么APK / AAR / APKLib格式将不存在;常规的JAR文件就足够了。但是它们没有,因为android资源文件与类文件不同,因此,有必要进行各种“链接”以使其对您的类可见:R类。

如果要使当前代码正常工作,则需要用编码的视图组实例替换fragment_main.xml。创建一个类/方法,提供一个包含您的按钮的ConstraintLayout实例(例如MyViewFactory.createConstraintLayoutWithButton),通过代码设置属性,然后替换

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_main, viewGroup, false);

    view.findViewById(R.id.emailSignInButton).setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

        }
    });

    return view;
}

带有类似内容

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState) {
    View view = MyViewFactory.createConstraintLayoutWithButton(getContext)

    view.findViewById(R.id.emailSignInButton).setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

        }
    });

    return view;
}

只要您不使用资源,就可以了。也就是说,这种方法非常脆弱,因此也许最好在APK之间创建意图过滤器,以使APK 2适用于APK 1。

© www.soinside.com 2019 - 2024. All rights reserved.