Как вызвать onResume () дочернего фрагмента, а не onResume () родительского фрагмента? - PullRequest
0 голосов
/ 23 ноября 2018

Предположим, у меня есть 3 Fragment s, 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, а не родительский?

1 Ответ

0 голосов
/ 23 ноября 2018

возможно ли вызвать только первый фрагмент onResume, а не родительский?

Нет, это невозможно.Это то, что я получаю, когда переопределяю onResume() во фрагменте и удаляю строку с super.onResume();

java.lang.RuntimeException: Невозможно возобновить действие {com.example.mytestapp / com.example.mytestapp.MainActivity}: android.support.v4.app.SuperNotCalledException: Fragment MyTestFragment {4037a6b # 0 id = 0x7f090035 фрагмент} не обращался к super.onResume ()

[...]

Причина: android.support.v4.app.SuperNotCalledException: фрагмент MyTestFragment {4037a6b # 0 id = 0x7f090035 фрагмента} не обращался к super.onResume ()

Но вы можете ввести поле protected int percent = x; в BaseFragment и дать ему другое значение x для каждого Fragment.

Вы можете установить это значение в любом методе, который вызывается до 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 s не нужно переопределять 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);
}
...