重用片段中的单例视图,如webView



我在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的最佳方式,还是有更简单的方法可以实现这一点?

如何解决此问题?

  • 我认为这个问题无法解决。你不可能在生命周期中有一些零碎的活动,至少是为了解决你的目的。有一些retainInstance,但也不会解决你的问题

这是在多个活动中重用同一WebView的最佳方式吗?还是有更简单的方法可以实现这一点?

  • 否。您不能在多个活动中使用同一个webview实例,这也是不好的做法

但是您可以在所有活动中使用您的片段(包含webview(作为新实例。在片段事务中使用addreplace

最新更新