我有两个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
加载到内存中?
@@ 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。