33

想象一下,我有FragmentA ,我从它开始DialogFragmentEditText在框中)。如何从EditTextFragmentA取回价值?我尝试制作这样的东西没有成功。

4

6 回答 6

87

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

此时,您EditTextDialogFragment父片段中获得了字符串。只需sendResult(int)在您的匿名类中使用该方法,TextChangeListener()以便在您需要时发送文本。

于 2013-08-02T20:36:32.810 回答
4

假设您正在将一些文件上传到服务器,单击上传按钮时应打开一个对话框,提示输入标题和可选标签。对话框本身包含 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;

}

我认为这篇文章对那些第一次使用对话框片段的人会有所帮助。我很难找到解决方案。希望这将在未来解决某人的问题。(对不起语言)

于 2018-02-07T06:43:45.987 回答
4

更好、更简单的方法之一是使用 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();
        }
    });
于 2018-10-22T18:03:18.947 回答
2

您需要通过回调方法将对话框中的数据发送回活动,然后让活动将该数据返回给您希望它转到的片段。只是一个简单的例子:

public void datFromDialog(String data){
    MyFragment mf = (MyFragment)getFragmentManager().findFragmentById(r.id.frag);

    mf.iWantNewData(data);
}
于 2013-08-02T20:16:46.433 回答
0

此方法确保调用片段实现对话框的 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);
            }
        });
        .....
    }
}
于 2018-08-18T20:32:57.117 回答
0

What you want, according to Android Developers...

于 2016-04-27T12:46:52.643 回答