Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 具有多个片段/视图的DialogFragment_Android - Fatal编程技术网

Android 具有多个片段/视图的DialogFragment

Android 具有多个片段/视图的DialogFragment,android,Android,如何通过动画一个接一个地显示包含多个片段的dialogfragment 我的用例是: DialogFragment与片段1一起显示。它有一个“下一步”按钮 用户单击下一步 同一对话框fragment在动画中显示带有幻灯片的片段2 任何指示都会有帮助 先谢谢你 这是我正在使用的基本对话框片段 public class BaseDialogFragment extends DialogFragment { public BaseDialogFragment () { }

如何通过动画一个接一个地显示包含多个片段的dialogfragment

我的用例是:

  • DialogFragment与片段1一起显示。它有一个“下一步”按钮
  • 用户单击下一步
  • 同一对话框fragment在动画中显示带有幻灯片的片段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);
        }
    }
    
    下面是行为的表现。显示带有流的对话框的是底部导航活动。下一个/上一个对话框带有滑入/滑出导航

    我也愿意接受其他建议,如对话主题活动

    我会做什么:

    1) 创建没有任何内容的父对话框片段

    2) 创建3个表示对话框每个状态的片段


    3) 在ParentDialogFragment::childFragmentManager的上下文中显示内容片段并在它们之间实现导航

    通过以下方式使用普通片段,我成功地创建了带有动画的自定义对话框片段

    将id添加到活动的根布局中

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/root_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
    其中,
    enter
    exit
    参数接受xml动画文件,如.xml中的
    anim/slide\u

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false" >
        <translate android:duration="300" android:fromXDelta="-100%" android:toXDelta="0%"/>
    </set>
    
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false" >
        <translate android:duration="300" android:fromXDelta="0%" android:toXDelta="-100%"/>
    </set>
    
    然后为对话框创建一个基类,允许关闭该对话框:

    public abstract class BaseDialogFragment extends Fragment {
    
        public void dismiss() {
            getActivity().getSupportFragmentManager()
                    .popBackStack(getClass().getName(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
        }
    }
    
    Back键也起作用,因为片段在后堆栈中。 现在从
    BaseDialogFragment
    类中创建您的对话框,并显示它们调用
    showFragment(dialogFragment,R.anim.slide\u in,R.anim.slide\u out)来自您的活动

    如果必须从Dialog1启动Dialog2,只需使用
    ((YourActivity)getActivity).showFragment(dialogFragment,R.anim.slide\u in,R.anim.slide\u out)

    在Youtube上搜索“片段技巧(Google I/O'17)”,即可了解其工作原理

    解决方案很简单
    addToBackStack

    对于动画:您可以设置自定义动画->
    事务。设置自定义动画(R.anim.first,R.anim.second…


    我建议您观看google演示,您会感到惊讶,希望如此。

    据我所知,您希望有一个父对话框片段,它管理两个子片段。 要做到这一点,您必须遵循这些步骤

  • 创建父对话框片段
  • 创建两个子片段
  • 将第一个片段添加到父片段
  • 添加从第一个子片段到父片段的回调,以将其替换为第二个子片段
  • 向父片段添加功能以替换子片段
  • 让我们从第一步开始。我们将创建一个容器对话框片段:

    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);
        }
    }
    
    class ChildFragment1 extends Fragment {
        //...the content is up to you...
    }
    
    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();
        }
    }
    
    我们的容器片段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" />
    

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

    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);
        }
    }
    
    class ChildFragment1 extends Fragment {
        //...the content is up to you...
    }
    
    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();
        }
    }
    
    现在我们必须添加一个接口来在父片段和子片段之间进行通信,以替换它:

    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();
        }
    }
    
    最后,我们必须在容器对话框片段中实现此接口,并添加替换功能:

    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();
        }
    }
    

    就这样。

    这个问题需要一些爱你的其他布局在哪里?你的按钮点击处理程序在哪里?还有,你必须为此使用额外的片段吗?(您看到了吗:)在DialogFragment中使用ViewPager。ViewPager的每个元素可以是不同的片段(扩展基本片段)。这给了我们很大的灵活性。@petey,不需要其他布局,因为这个问题与布局无关。正是布局1将您带到布局2(甚至布局3)。它就像对话框中的工作流。如果我使用viewswitcher,那么所有的逻辑都会在一起,这太混乱了。我希望我们可以在不同的“容器”中实现这一点,如果你知道我的意思,但是根据你的描述,你在这里创建了多个对话框?我想有一个多片段的对话,这是我要问的第三点。你能展示一些代码吗?太棒了。应得的赏金:)。我可以问你一个问题吗。我如何处理按下的后退按钮,使其从childfragment2返回到childfragment1?因为现在按下后退按钮只会关闭整个对话框。为此,您必须在对话框中添加一个键侦听器。您可以将
    getDialog().setOnKeyListener
    添加到容器对话框片段中,然后按下“返回”按钮,然后弹出堆栈。作为另一个选项,由于现在有一个NavHostFragment可以使用它。而不是使用。在ContainerDialogFragment中,您可以使用
    childFragmentManager.findFragmentById(R.id.nav_host_fragment)作为NavHostFragment
    ,以便导航。在子系统中,您可以使用标准的
    findNavController()
    。然后,您可以在对话框_navigation.xml中设置导航。