假设我有3个Fragment
,BaseFragment
,以及第一个片段和第二个片段。
我已经实现了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上调用第一个片段,而不能在父片段上调用?
答案 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);
}