想象一下,我有FragmentA,我从它开始DialogFraank(框中有EditText
)。如何将EditText
中的值取回FragmentA?我尝试制作这样的东西,但我没有成功。
更好、更简单的方法之一是使用Android ViewModel。
这有助于更轻松地共享数据,而无需跨片段发送任何数据。您不仅可以对DialogFragments执行此操作,还可以对普通片段执行此操作。
来源:https://developer.android.com/topic/libraries/architecture/viewmodel
这是我做的
我的ViewModel如下所示
import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.MutableLiveData;
import android.arch.lifecycle.ViewModel;
public class PlayerViewModel extends ViewModel {
private final MutableLiveData<Player> selectedPlayer = new MutableLiveData<>();
public LiveData<Player> getSelectedPlayer() {
return selectedPlayer;
}
public void selectPlayer(Player player) {
selectedPlayer.setValue(player);
}
}
在选择播放器的片段中,我在onCreate方法中使用以下代码绑定ViewModel
playerViewModel = ViewModelProviders.of(getActivity()).get(PlayerViewModel.class);
选择特定播放器时,请使用以下选项(可以使用ArrayAdapter、DialogFragment选择器或任何要显示播放器列表的选项)
playerViewModel = ViewModelProviders.of(getActivity()).get(PlayerViewModel.class);
最后,在需要显示Player信息的片段中,在onCreate方法中执行以下操作
PlayerViewModel model = ViewModelProviders.of(getActivity()).get(PlayerViewModel.class);
model.getSelectedPlayer().observe(this, new Observer<Player>() {
@Override
public void onChanged(@Nullable Player selPlayer) {
if (selPlayer != null)
player = selPlayer;
populateData();
}
});
假设您正在将一些文件上载到服务器,单击上载按钮将打开一个对话框,提示输入标题和可选标记。对话框本身包含两个按钮,分别是cancel和continue。
使用布局xml文件UI。
然后创建一个扩展DialogFragment的类。在onCreateView()方法中放大布局并初始化视图。
在该类中创建一个接口
public interface uploadDialogInterface
{
public void senddata(String title, String tag);
}
uploadDialogInterface interfaceObj;
String title="";
String tag=" ";
重要的是需要重写onAttach()方法
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.context=context;
interfaceObj= (uploadDialogInterface) getTargetFragment();
}
在on按钮中,单击调用如下界面方法
@Override
public void onClick(View v) {
int id=v.getId();
if(id== R.id.vB_fud_cancel)
{
dismiss();
}
else if(id== R.id.vB_fud_upload)
{
title=mVideotitle.getText().toString();
tag=mOptionaltag.getText().toString();
if(mVideotitle.getText().toString().isEmpty()) {
Snackbar.make(mVideotitle,"Please enter the video title", Snackbar.LENGTH_SHORT).show();
}else
{
interfaceObj.senddata(title,tag);
dismiss();
}
}
}
在启动对话框的片段或活动中,应该包含setTargetFragment属性。
private void callUploadDialog()
{
UploadDialogFragment fragment = new UploadDialogFragment();
fragment.setTargetFragment(this, 0);
FragmentManager manager = getFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_in);
fragment.show(ft, "UploadDialogFragment");
fragment.setCancelable(false);
}
最后,您应该实现接口(在对话框片段中声明)并重写该方法
@Override
public void senddata(String title,String optionaltag) {
this.videoTitle=title;
this.optionalTag=optionaltag;
}
我认为这篇文章将对那些第一次使用对话片段的人有所帮助。我很难找到解决办法。希望这能在将来解决某人的问题。(抱歉用这种语言)
Fragment.onActivityResult()
方法在这种情况下很有用。它需要getTargetRequest estCode()
,这是您在片段之间设置的代码,以便可以识别它们。此外,它需要一个请求代码,如果代码运行良好,通常只需0
,然后是Intent
,您也可以附加一个字符串,就像这样
Intent intent = new Intent();
intent.putExtra("STRING_RESULT", str);
此外,应该在发送结果的片段中使用setTargetFragment(Fragment,requestCode),以识别它。总的来说,请求片段中的代码如下所示:
FragmentManager fm = getActivity().getSupportFragmentManager();
DialogFragment dialogFragment = new DialogFragment();
dialogFragment.setTargetFragment(this, REQUEST_CODE);
dialogFragment.show();
要发送数据的类(DialogFragment)将使用我们刚才定义的用于发送数据的片段:
private void sendResult(int REQUEST_CODE) {
Intent intent = new Intent();
intent.putStringExtra(EDIT_TEXT_BUNDLE_KEY, editTextString);
getTargetFragment().onActivityResult(
getTargetRequestCode(), REQUEST_CODE, intent);
}
为了接收数据,我们在最初启动DialogFraank的Fraank中使用这种类型的类:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// Make sure fragment codes match up
if (requestCode == DialogFragment.REQUEST_CODE) {
String editTextString = data.getStringExtra(
DialogFragment.EDIT_TEXT_BUNDLE_KEY);
此时,您拥有父片段中对话框片段中编辑文本的字符串。只需在您的TextChangeListener()
匿名类中使用sendResult(int)
方法,以便在需要时发送文本。
我有一个DialogFragment,它使用FragmentPagerAdapter来显示选项卡。每个选项卡都有一个使用RecyclerView的不同片段。我可以获取单击后传递给片段的项目,但如何才能将数据从片段获取到DialogFragment,以便将其传递给调用活动? TabDialog扩展DialogFraank: TabAdapter扩展了FragmentPagerAdapter 在Fra
我有一个包含EditText的片段,当我单击该EditText时,会出现一个DatePicker对话框来选择日期。 FragmentFile 对话框片段 问题是我不知道如何将数据(选定日期)从DialogFraank传递到片段? 我读了一些主题,但这并没有帮助我感到困惑(抱歉再次提出这个问题)。 主题1主题2
我正在尝试通过将数据与接口传递给片段来将数据从对话片段获取到片段。到目前为止,我知道首先是因为它的片段,我需要在MainActive上实现接口,并从那里将数据发送到我想要的任何片段。我明白,但我不知道如何做到这一点。到目前为止,我已经在MainActive中实现了接口,我正在获取数据,但我不知道如何将其发送到片段。 主要活动 对话片段-此对话片段从画廊/相机获取图片 片段-此片段应从dialogf
我目前正在一个单一的活动应用程序中工作,该应用程序为每个屏幕使用片段。我也在使用MVP设计模式。 上下文 我有一个片段(Fragment-a),其中有一个项目列表。此片段处理每个项的操作。因为它可以访问演示者 我想要什么? 如何将Frainsion-A作为侦听器传递给DialogFraank(Frainsion-B),以便我可以从DialogFraank调用操作?
生成的路径应该传递给片段,我通过本课中的活动使用接口来练习这一点 此解决方案工作良好,直到用户不改变设备的方向。 当设备在DialogFragment阶段或裁剪活动阶段旋转时,第一个活动和fragemnt被重新创建,并且DialogFragment的实例被销毁。所以我的回调没有运行,什么也没有发生。让我给你看代码: 设置单元活动 AddNewUnitFragment 对话框ImageSelect
我想让对话框片段(DialogFragment)向我返回一个值,该值是在退出时在编辑数量(editQuantity)中输入的。 但我没有办法让它发挥作用。我可以通过将值传递给intent来实现这一点,但这会破坏当前活动的进度。 除了传递意图之外,还有什么方法可以返回我的值吗?