如何调用子片段的onResume()而不是父片段的onResume()?

时间:2018-11-23 20:17:16

标签: android fragment

假设我有3个FragmentBaseFragment,以及第一个片段和第二个片段。

我已经实现了onResume()中的BaseFragment,并编写了代码来设置宽度和高度,例如-

public void onResume() {

    super.onResume();
    WindowManager.LayoutParams params = getDialog().getWindow().getAttributes();
    params.width = RelativeLayout.LayoutParams.MATCH_PARENT;
    params.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
    params.gravity = Gravity.CENTER;
    getDialog().getWindow().setAttributes(params);

    Log.d("upisdk", "basedialogfragment onresume()");
}

我有第一个片段,其中我想将宽度设置为例如总宽度的90%。我也在这里实现了onResume()-

@Override
public void onResume() {
    super.onResume();

    WindowManager.LayoutParams params = getDialog().getWindow().getAttributes();
    params.width = (getWidth(getContext()) / 100) * 90;
    params.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
    params.gravity = Gravity.CENTER;
    getDialog().getWindow().setAttributes(params);

    Log.d("upisdk", "onresume called on Changeddialogfragment");

}

SecondFragment中,我要设置为80%,就像上面的Fragment一样。

我的onResume()被打了两次。一次用于BaseFragment,另一次用于FirstFragment

是否可以仅在onResume上调用第一个片段,而不能在父片段上调用?

1 个答案:

答案 0 :(得分:1)

  

是否可以仅在onResume上调用第一个片段,而不能在父片段上调用?

否,这是不可能的。这是我在片段中覆盖onResume()并用super.onResume();

删除行时得到的结果
  

java.lang.RuntimeException:无法恢复活动{com.example.mytestapp / com.example.mytestapp.MainActivity}:android.support.v4.app.SuperNotCalledException:片段MyTestFragment {4037a6b#0 id = 0x7f090035片段}没有通过调用super.onResume()

[...]

  

原因:android.support.v4.app.SuperNotCalledException:片段   MyTestFragment {4037a6b#0 id = 0x7f090035片段}没有调用   到super.onResume()

但是您可以在protected int percent = x;中引入字段BaseFragment,并为每个Fragment赋予不同的值 x

您可以在onResume()之前调用的任何方法中设置此值,而不必调用其超类实现,例如在onCreateView()中。

或者您介绍自己的方法,然后从中调用它onCreate()

例如对于父类:

protected void setPercent(){
    percent = 100;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setPercent();
}

在第一个Fragment中,您写

@Override
protected void setPercent(){
    percent = 90;
}

然后,子Fragment不需要覆盖onResume(),并且父类可以正确设置LayoutParams

public void onResume() {
    super.onResume();
    WindowManager.LayoutParams params = getDialog().getWindow().getAttributes();
    params.width = (getWidth(getContext()) * percent / 100);
    params.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
    params.gravity = Gravity.CENTER;
    getDialog().getWindow().setAttributes(params);
}