想象一下,我有FragmentA ,我从它开始DialogFragment(EditText
在框中)。如何从EditText
FragmentA取回价值?我尝试制作这样的东西,但我没有成功。
6 回答
该Fragment.onActivityResult()
方法在这种情况下很有用。它需要getTargetRequestCode()
,这是您在片段之间设置的代码,以便可以识别它们。此外,它需要一个请求代码,通常只要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)将使用我们刚刚定义的这个 Fragment 来发送数据:
private void sendResult(int REQUEST_CODE) {
Intent intent = new Intent();
intent.putStringExtra(EDIT_TEXT_BUNDLE_KEY, editTextString);
getTargetFragment().onActivityResult(
getTargetRequestCode(), REQUEST_CODE, intent);
}
为了接收数据,我们在最初启动 DialogFragment 的 Fragment 中使用这种类型的类:
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);
此时,您EditText
从DialogFragment
父片段中获得了字符串。只需sendResult(int)
在您的匿名类中使用该方法,TextChangeListener()
以便在您需要时发送文本。
假设您正在将一些文件上传到服务器,单击上传按钮时应打开一个对话框,提示输入标题和可选标签。对话框本身包含 2 个按钮说取消并继续。
使用布局 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 Button 点击调用接口方法,如
@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();
}
}
}
并且在您启动对话框的 Fragment 或活动内部应包含 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;
}
我认为这篇文章对那些第一次使用对话框片段的人会有所帮助。我很难找到解决方案。希望这将在未来解决某人的问题。(对不起语言)
更好、更简单的方法之一是使用 Android ViewModel。
这有助于更轻松地共享数据,而无需跨片段发送任何数据。您不仅可以为 DialogFragments 执行此操作,还可以为普通 Fragments 执行此操作。
来源: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);
}
}
在我选择 Player 的 Fragment 中,我在 onCreate 方法中使用以下代码来绑定 ViewModel
playerViewModel = ViewModelProviders.of(getActivity()).get(PlayerViewModel.class);
选择特定播放器时,使用以下内容(您可以使用 ArrayAdapter、DialogFragment 的选择器或任何您想要显示播放器列表的东西)
playerViewModel = ViewModelProviders.of(getActivity()).get(PlayerViewModel.class);
最后,在需要显示播放器信息的片段中,在 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();
}
});
您需要通过回调方法将对话框中的数据发送回活动,然后让活动将该数据返回给您希望它转到的片段。只是一个简单的例子:
public void datFromDialog(String data){
MyFragment mf = (MyFragment)getFragmentManager().findFragmentById(r.id.frag);
mf.iWantNewData(data);
}
此方法确保调用片段实现对话框的 onChangeListener。
FragmentA(调用片段):
MyDialogFragment f = new MyDialogFragment();
Bundle args = new Bundle();
args.putString("data", data);
f.setArguments(args);
// Set the calling fragment for this dialog.
f.setTargetFragment(FragmentA.this, 0);
f.show(getActivity().getSupportFragmentManager(), "MyDialogFragment");
我的对话片段:
import android.support.v4.app.DialogFragment;
public class MyDialogFragment extends DialogFragment {
public OnChangeListener onChangeListener;
interface OnChangeListener{
void onChange(Data data);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get the calling fragment and ensure that it implements onChangeListener.
try {
onChangeListener = (OnChangeListener) getTargetFragment();
} catch (ClassCastException e) {
throw new ClassCastException(
"The calling Fragment must implement MyDialogFragment.onChangeListener");
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
.....
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Send the data to the calling fragment.
onChangeListener.onChange(data);
}
});
.....
}
}
What you want, according to Android Developers...