将参数传递给DialogFragment

gio*_*ozh 110 android android-dialogfragment

我需要传递一些变量DialogFragment,所以我可以执行一个动作.Eclipse建议我应该使用

Fragment#setArguments(Bundle)
Run Code Online (Sandbox Code Playgroud)

但我不知道如何使用这个功能.如何使用它将变量传递给对话框?

Jaf*_*KhQ 285

运用 newInstance

public static MyDialogFragment newInstance(int num) {
    MyDialogFragment f = new MyDialogFragment();

    // Supply num input as an argument.
    Bundle args = new Bundle();
    args.putInt("num", num);
    f.setArguments(args);

    return f;
}
Run Code Online (Sandbox Code Playgroud)

并得到像这样的Args

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mNum = getArguments().getInt("num");
    ...
}
Run Code Online (Sandbox Code Playgroud)

请参阅此处的完整示例
http://developer.android.com/reference/android/app/DialogFragment.html

  • @SIrCodealot效果与在Activity或Fragment上设置变量相同.如果您遇到破坏并重新创建DialogDragment(如旋转更改)的内容,则会丢失所有变量. (9认同)
  • 对于所有想知道为什么在这种情况下不使用重载的构造函数的人,请参阅关于该主题的另一篇很有启发性的讨论:/sf/ask/980826591/建设者 (2认同)
  • 我花了一分钟才注意到 **savedInstanceState** 没有被使用。 (2认同)

Sam*_*Sam 18

我曾经从listview发送一些值

如何发送

mListview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            Favorite clickedObj = (Favorite) parent.getItemAtPosition(position);

            Bundle args = new Bundle();
            args.putString("tar_name", clickedObj.getNameTarife());
            args.putString("fav_name", clickedObj.getName());

            FragmentManager fragmentManager = getSupportFragmentManager();
            TarifeDetayPopup userPopUp = new TarifeDetayPopup();
            userPopUp.setArguments(args);
            userPopUp.show(fragmentManager, "sam");

            return false;
        }
    });
Run Code Online (Sandbox Code Playgroud)

如何接收 DialogFragment的onCreate()方法

    Bundle mArgs = getArguments();
    String nameTrife = mArgs.getString("tar_name");
    String nameFav = mArgs.getString("fav_name");
    String name = "";
Run Code Online (Sandbox Code Playgroud)

// Kotlin上传

 val fm = supportFragmentManager
        val dialogFragment = AddProgFargmentDialog() // my custom FargmentDialog
        var args: Bundle? = null
        args?.putString("title", model.title);
        dialogFragment.setArguments(args)
        dialogFragment.show(fm, "Sample Fragment")
Run Code Online (Sandbox Code Playgroud)

//收到

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (getArguments() != null) {
            val mArgs = arguments
            var myDay= mArgs.getString("title")
        }
    }
Run Code Online (Sandbox Code Playgroud)


dug*_*ggu 8

所以有两种方法可以将值从片段/活动传递到对话框片段:-

  1. 使用 make setter 方法创建对话框片段对象并传递值/参数。

  2. 通过 bundle 传递值/参数。

方法一:

// Fragment or Activity 
@Override
public void onClick(View v) {
     DialogFragmentWithSetter dialog = new DialogFragmentWithSetter();
     dialog.setValue(header, body);
     dialog.show(getSupportFragmentManager(), "DialogFragmentWithSetter");         
}


//  your dialog fragment
public class MyDialogFragment extends DialogFragment {
    String header; 
    String body;
    public void setValue(String header, String body) {   
          this.header = header;
          this.body = body;
    }
    // use above variable into your dialog fragment
}
Run Code Online (Sandbox Code Playgroud)

注意:- 这不是最好的方法

方法二:

// Fragment or Activity 
@Override
public void onClick(View v) {
     DialogFragmentWithSetter dialog = new DialogFragmentWithSetter();
     
     Bundle bundle = new Bundle();
     bundle.putString("header", "Header");
     bundle.putString("body", "Body");  
     dialog.setArguments(bundle);
     dialog.show(getSupportFragmentManager(), "DialogFragmentWithSetter");         
}


//  your dialog fragment
public class MyDialogFragment extends DialogFragment {
    String header; 
    String body;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
             header = getArguments().getString("header","");
             body = getArguments().getString("body","");
        }
    }
    // use above variable into your dialog fragment
}
Run Code Online (Sandbox Code Playgroud)

注意:- 这是最好的方法。


the*_*osh 5

作为使用Fragments的一般方式,正如JafarKhQ指出的那样,你不应该在构造函数中传递params,而是使用Bundle.

类中的内置方法FragmentsetArguments(Bundle)getArguments().

基本上,你所做的就是设置一个包含所有Parcelable物品的捆绑包并发送它们.
反过来,你的片段会将这些物品放入其中onCreate并对它们起到魔力.

DialogFragment链接中显示的方式是在具有一种特定类型数据的多出现片段中执行此操作的一种方法,并且大部分时间都可以正常工作,但您也可以手动执行此操作.