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