Полноэкранный DialogFragment - показывает ниже AppBar с транзакцией, но работает с простым .show () - PullRequest
0 голосов
/ 13 марта 2019

Я следовал этому учебнику (4. Полноэкранный диалог), который близок к рекомендациям по дизайну материалов.

Но интересно то, что если я использую официальныйкод вот так:

FragmentManager fragmentManager = getSupportFragmentManager();
FullscreenDialogFragment newFragment = new FullscreenDialogFragment();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.add(android.R.id.content, 
newFragment).addToBackStack(null).commit();

Я получаю:

enter image description here

Но используя «простой» метод

DialogFragment dialog = new FullscreenDialogFragment();
dialog.show(getSupportFragmentManager(), TAG);

Работает как задумано:

enter image description here

Так что здесь происходит?


Мой код

Мой класс диалога в основном такой же, за исключением того, что я не использовал это из учебника

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    return dialog;
}

Но вместо этого у меня есть указанный файл стиля:

<!-- SA suggestion dialog theme. -->
<style name="FullscreenDialogTheme" parent="Base.Theme.AppCompat.DialogWhenLarge">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@color/colorLightBackground</item>
    <item name="android:windowIsFloating">false</item>

    <item name="android:windowEnterAnimation">@android:anim/slide_in_left</item>
    <item name="android:windowExitAnimation">@android:anim/slide_out_right</item>
</style>

КакойЯ установил с помощью

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NORMAL, R.style.FullscreenDialogTheme);
}

Это диалоговое окно XML (я заменил виджеты поддержки на AndroidX)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@android:color/white"
     android:fitsSystemWindows="true"
     android:orientation="vertical">

<com.google.android.material.appbar.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <ImageButton
            android:id="@+id/sa_dialog_close_btn"
            android:layout_width="?attr/actionBarSize"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/selectableItemBackgroundBorderless"
            android:tint="@android:color/white"
            android:src="@drawable/ic_close_white_24dp"
            android:contentDescription="@string/sa_dialog_close_btn_content_desc" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:text="@string/dialog_title"
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Title"
            android:textColor="@android:color/white" />

        <Button
            android:id="@+id/sa_dialog_confirm_btn"
            style="@style/Widget.AppCompat.Button.Borderless"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:paddingLeft="2dp"
            android:paddingRight="2dp"
            android:text="@string/sa_dialog_confirm"
            android:textColor="@android:color/white" />

    </LinearLayout>

</com.google.android.material.appbar.AppBarLayout>

<androidx.core.widget.NestedScrollView
    android:id="@+id/nested_scroll_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="none"
    android:scrollingCache="true">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|center_vertical"
        android:text="Full Screen Dialog"/>

</androidx.core.widget.NestedScrollView>

И класс диалога

public class FullscreenDialogFragment extends DialogFragment {

@BindView(R.id.sa_dialog_close_btn)
ImageButton close_btn;
@BindView(R.id.sa_dialog_confirm_btn)
Button confirm_btn;
//Necessary in fragments
private Unbinder unbinder;

Context mContext;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NORMAL, R.style.FullscreenDialogTheme);
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.dialog_test, container, false);

 //        mContext = Objects.requireNonNull(container).getContext();
    unbinder = ButterKnife.bind(this, view);

    close_btn.setOnClickListener(listener -> cancelDialog());
    confirm_btn.setOnClickListener(listener -> confirmDialog());

    return view;
}

private void cancelDialog() {
    dismiss();
}

private void confirmDialog() {
//        Toast.makeText(mContext, "Confirmed", Toast.LENGTH_SHORT).show();
}

@Override
public void onDestroy() {
    super.onDestroy();
    unbinder.unbind();
 }
}

Я полагаю, что это как-то связано с этой строкой, как предлагается в этом ответе:
https://stackoverflow.com/a/44085523/1972372

transaction.add(android.R.id.content, fragment)

Где ядолжен ссылаться на макет из активау, который создает фрагмент?
Я пробовал это с корневым макетом действия, но получил только странные наложения контента:

transaction.add(R.id.sa_activity_parent_layout, newFragment).addToBackStack(null).commit();

enter image description here

...