当前位置: 首页 > 知识库问答 >
问题:

如何使用viewModel发送AlertDialog片段的结果?

沈伟
2023-03-14

我有一个使用意图与其父级通信的自定义对话框片段。(我从某个地方复制了它)。这使用旧框架来传达它的一些方法,例如onActivityResultgetTargetFrament()现在已被弃用。

我知道可以用新方法替换这些不推荐使用的方法,例如如何替换 setTargetFragment() 现在它已被弃用,但只是为了得到是或否的结果而走了这么远?!

有没有简单的方法可以做到这一点?我尝试使用ViewModel,但不起作用!

我的视图模型尝试:AlertDialogViewModel.java

import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class AlertDialogViewModel extends ViewModel {


    private final MutableLiveData<Boolean> mAlertDialogResult = new MutableLiveData();
    public LiveData<Boolean> getAlertDialogResult() {
        return mAlertDialogResult;
    }
    public void setAlertDialogResult(boolean mResult) {
        mAlertDialogResult.setValue(mResult);
    }


}

在MyAlertDialog.java里面:

public class ConfirmDialog extends DialogFragment {

    AlertDialogViewModel mViewModel;

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        return new MaterialAlertDialogBuilder(requireContext())
                .setTitle(Title)
                .setMessage(MESSAGE)
                .setPositiveButton("YES", (d, b) -> onResult(true))
                .setNegativeButton("NO", (d, b) -> onResult(false))
                .create();
    }

    private void onResult(boolean result) {
       mViewModel.setAlertDialogResult(result);
    }
    private static void showResult(Framgment fragment) {
       dialog.show(fragment.getParentFragmentManager(), null);
    }
}

但当我想烤面包时,这不起作用:

MyAlertDialog.showResult(this)
AlertDialogViewModel model = new ViewModelProvider(this).get(AlertDialogViewModel.class);
        model.getAlertDialogResult().observe(this, result-> {
            Toast(this, ""+result,Toast.LENGTH_SHORT).show();
        });

共有1个答案

黄沈浪
2023-03-14

您永远不会初始化对话框片段视图模型。您需要获得与托管Activity或父Fragment中使用的实例相同的实例。

@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
    // Assumes requireContext() returns the Activity this dialog is shown in
    mViewModel = new ViewModelProvider(requireContext()).get(AlertDialogViewModel.class)

    return new MaterialAlertDialogBuilder(requireContext())
            .setTitle(Title)
            .setMessage(MESSAGE)
            .setPositiveButton("YES", (d, b) -> onResult(true))
            .setNegativeButton("NO", (d, b) -> onResult(false))
            .create();
}

然后确保在您的片段中获得相同的实例:

AlertDialogViewModel model = new ViewModelProvider(requireContenxt()).get(AlertDialogViewModel.class);
model.getAlertDialogResult().observe(this, result-> {
    Toast(this, ""+result,Toast.LENGTH_SHORT).show();
});

最后,什么是对话,为什么这是静态的?

private static void showResult(Framgment fragment) {
   dialog.show(fragment.getParentFragmentManager(), null);
}
 类似资料:
  • 我有一个包含一个活动和两个片段的应用程序,在第一个片段中,我应该能够将数据插入数据库,在第二个片段中,我应该能够在一个RecyclerView中看到添加的项目。 所以我已经创建了数据库、我的RecyclerView适配器和ViewModel, 我是否应该在活动中初始化ViewModel,并以某种方式从片段中调用它来使用insert? 我是否应该在两个片段中初始化viewmodel两次? 我的代码如

  • 我使用单个viewModel来处理活动和它的所有片段。 但当我尝试在应用程序中使用时,却找不到它们的引用。 我想要帮助如何使用这些扩展的一些基本的例子,我尝试搜索的例子没有找到任何。

  • 我有一个带有“x”个片段的视图寻呼机,第一个是“HomeFragment”:它包含2个下拉列表(微调器) 其他片段(FragmentA、FragmentB、FragmentC等)的UI会根据这些微调器的选定项值进行更改 因此,问题是:如何从“HomeFragmet”中的微调器传递此选定项值以用于其他片段?

  • 我通过MVVM模式和谷歌jetpack依赖性开发了一个应用程序。我有一个,它有一个我需要的方法。我有两个视图,分别是和,首先我在中创建了实例,并通过ViewModel向观察者订阅LiveData: 现在,我将在中执行操作方法,并观察 但我跟踪创建实例

  • 在我的应用程序中,我有一个对话框片段,它在启动MainActivity之前首先打开。当在该对话框片段中输入一些数据并单击“确认”时,我需要向片段(Main)发送一些值(表示双值)。 我的主要活动是查看寻呼机,它有两个片段。一个是片段(主)。。我必须将数据发送到我的对话框片段到片段(main) 片段(Main)通过viewpager附加到MainActivity。我尝试使用intent和bundle

  • 我想在片段的活动中使用一些文本视图(cityField,updatedField)。我知道在活动中使用它们会更容易,但问题是,由于要获取一些JSON数据,我不得不在Fragment上加入一些代码 我已经得到了活动代码的ID 现在我想在我的片段中使用它们 所以问题是 - 这可能吗?如果可能,如何? 我已经检查了这个网站上的一些答案 - 在Android中将数据从活动发送到片段 如何使用捆绑包将数据从

  • 我需要观察Modelview中的livedata更改来更新片段(将列表添加到RecycerView中)。 该实现工作正常,但在片段之间切换时面临问题。 并试图将观察者移除为:或或或尝试在

  • 问题内容: 我没有使用过元素。我没有使用表格,因为,我不想回发..请指导我如何做ajax调用,从而能够将viewmodel传递给控制器​​的action方法获得$.ajax吗?我的表格如下所示: HTML: jQuery / JavaScript: 问题答案: 您应该手动从输入中收集数据,并构造与C#模型类相对应的JSON对象。例如,如果您在操作方法中等待ProductViewModel对象,则可