具有多个片段/视图的DialogFragment

Sna*_*ake 7 android

如何使用动画一个接一个地显示包含多个片段的对话碎片?

我的用例是:

  1. DialogFragment显示片段1.它有一个"下一步"按钮
  2. 用户点击下一步
  3. 相同的dialogFragment显示片段2,其中包含动画幻灯片.

任何指针都会有所帮助.

先感谢您.

这是我正在使用的基本对话片段

public class BaseDialogFragment extends DialogFragment {

    public BaseDialogFragment () {

    }

    public static BaseDialogFragment newInstance(String title) {
        BaseDialogFragment frag = new BaseDialogFragment ();
        Bundle args = new Bundle();
        args.putString("title", title);
        frag.setArguments(args);
        return frag;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment, container);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);


        getDialog().getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是行为的方式.BottomNavigation活动正在显示带流的对话框.下一个/上一个对话框带有滑入/导出导航.

在此输入图像描述

我也对其他建议持开放态度,例如对话主题活动

小智 8

据我了解,您希望有一个父对话框片段来管理两个子片段。为此,您必须遵循这些步骤。

  1. 创建父对话框片段
  2. 创建两个子片段
  3. 将第一个片段添加到父片段
  4. 添加从第一个子片段到父对象的回叫,以将其替换为第二个子片段
  5. 向父片段添加功能以替换子片段

让我们从第一步开始。我们将创建一个容器对话框片段:

class ContainerDialogFragment extends DialogFragment {
    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
        return inflater.inflate(R.layout.container_fragment, container, false);
    }
}
Run Code Online (Sandbox Code Playgroud)

我们的container_fragment xml如下所示:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
Run Code Online (Sandbox Code Playgroud)

然后我们创建两个子片段:

class ChildFragment1 extends Fragment {
    //...the content is up to you...
}
Run Code Online (Sandbox Code Playgroud)

class ChildFragment2 extends Fragment {
    //...the content is up to you...
}
Run Code Online (Sandbox Code Playgroud)

我们将第一个片段添加到容器对话框片段中:

class ContainerDialogFragment extends DialogFragment {
    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
        return inflater.inflate(R.layout.container_fragment, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        ChildFragment1 childFragment1 = new ChildFragment1();
        transaction.replace(R.id.fragment_container, childFragment1);
        transaction.commit();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我们必须添加一个接口以在父片段和子片段之间进行通信以替换它:

class ChildFragment1 extends Fragment {
    interface ChildFragment1Listener {
        void onButtonPressed();
    }

    //you have to call this method when user pressed to button
    void onButtonPressed() {
        ChildFragment1Listener listener = (ChildFragment1Listener) getParentFragment();
        listener.onButtonPressed();
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我们必须在容器对话框片段中实现此接口,并添加替换功能:

class ContainerDialogFragment extends DialogFragment implements ChildFragment1.ChildFragment1Listener {
    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
        return inflater.inflate(R.layout.container_fragment, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        ChildFragment1 childFragment1 = new ChildFragment1();
        transaction.replace(R.id.fragment_container, childFragment1);
        transaction.commit();
    }

    @Override
    void onButtonPressed() {
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        //Out of simplicity, i am creating ChildFragment2 every time user presses the button. 
        //However, you should keep the instance somewhere to avoid creation.
        ChildFragment2 childFragment2 = new ChildFragment2();
        transaction.replace(R.id.fragment_container, childFragment2);
        //You can add here as well your fragment in and out animation how you like.
        transaction.addToBackStack("childFragment2");
        transaction.commit();
    }
}
Run Code Online (Sandbox Code Playgroud)

而已。