我在Android项目中使用了一些JavaScript代码,我希望该代码可以完全加载并准备在活动之间共享。为此,我在扩展活动的类中创建了WebView,并实现了一个片段,该片段使用此webview作为其视图。片段看起来像这样。
public class CalculatorWebViewFragment extends Fragment {
private Context context;
public View view;
private WebView calculatorWebView;
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.context = context;
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState) {
AndroidApplication state = ((AndroidApplication) context.getApplicationContext());
calculatorWebView = state.getCalculatorWebView();
if (calculatorWebView.getParent() != null) {
((ViewGroup) calculatorWebView.getParent()).removeView(calculatorWebView); // <- fix/
}
view = calculatorWebView;
return view;
}
}
在我的活动xml中,我有类似的内容
<fragment
android:id="@+id/calculator_web_view_fragment_in_test"
android:name="com.classcalc.classcalc.fragments.CalculatorWebViewFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="@id/topBarFragmentContainer"
app:layout_constraintEnd_toEndOf="@id/topBarFragmentContainer"
app:layout_constraintStart_toStartOf="@id/topBarFragmentContainer"
app:layout_constraintTop_toBottomOf="@+id/topBarFragmentPlaceHolder" />
我唯一的问题是,如果我的某些活动正在显示使用该片段的其他活动,那么当我返回上一个活动(未重新创建该活动)时,该片段将显示为空白屏幕。我认为这是因为子活动称为该片段的onCreateView方法,该方法将删除CalculatorWebView的上一个父级。
我尝试通过执行类似的操作在恢复方法的主要活动中重置该片段
frg = getSupportFragmentManager().findFragmentById(R.id.my_fragment_id);
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.detach(frg);
ft.attach(frg);
ft.commit();
但它似乎无法解决我的问题。如何解决此问题?难道这是在多个活动中重用同一WebView的最佳方法,还是有一种更简单的方法来实现此目的?
答案 0 :(得分:1)
如何解决此问题?
retainInstance
的东西,但也无法解决您的问题。这也是在多个活动中重用同一WebView的最佳方法,还是有一种更简单的方法来实现此目的?
但是您可以在所有活动中使用片段(包含webview)作为新实例。在片段事务中使用add
或replace
。