传递参数到对话框片段

我需要将一些变量传递给 DialogFragment,这样我就可以执行一个操作

Fragment#setArguments(Bundle)

但是我不知道如何使用这个函数。我如何使用它来传递变量到我的对话框?

130359 次浏览

使用 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;
}

然后像这样抓住阿格人

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

在这里可以看到完整的例子
Http://developer.android.com/reference/android/app/dialogfragment.html

正如 JafarKhQ 指出的,作为处理片段的一般方法,不应该在构造函数中传递参数,而应该使用 Bundle

Fragment类中的内置方法是 setArguments(Bundle)getArguments()

基本上,您要做的就是建立一个包含所有 Parcelable项目的包,然后将它们发送出去。反过来,你的碎片会在它的 onCreate中获得这些物品,并对它们施展魔法。

DialogFragment链接中显示的方法是在一个具有特定数据类型的多显示片段中进行此操作的一种方法,并且在大多数情况下都可以正常工作,但是您也可以手动进行此操作。

在我的例子中,上面的 bundle-operate代码都不能工作; 下面是我的决定(我不知道它是否是正确的代码,但是在我的例子中可以工作) :

public class DialogMessageType extends DialogFragment {
private static String bodyText;


public static DialogMessageType addSomeString(String temp){
DialogMessageType f = new DialogMessageType();
bodyText = temp;
return f;
};


@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final String[] choiseArray = {"sms", "email"};
String title = "Send text via:";
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(title).setItems(choiseArray, itemClickListener);
builder.setCancelable(true);
return builder.create();
}


DialogInterface.OnClickListener itemClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case 0:
prepareToSendCoordsViaSMS(bodyText);
dialog.dismiss();
break;
case 1:
prepareToSendCoordsViaEmail(bodyText);
dialog.dismiss();
break;
default:
break;
}
}
};
[...]
}


public class SendObjectActivity extends FragmentActivity {
[...]


DialogMessageType dialogMessageType = DialogMessageType.addSomeString(stringToSend);
dialogMessageType.show(getSupportFragmentManager(),"dialogMessageType");


[...]
}

我过去常常从我的列表视图中发送一些值

如何发送

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

如何在 DialogFragment 的 onCreate ()方法中接收

    Bundle mArgs = getArguments();
String nameTrife = mArgs.getString("tar_name");
String nameFav = mArgs.getString("fav_name");
String name = "";

//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")

收到

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

因此,有两种方法可以将值从片段/活动传递给对话框片段:-

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

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

方法一:

// 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
}

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

方法二:

// 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
}

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

我只是想展示一下如何按照@jafarkhQ 在 Kotlin 对那些使用 abc 0的用户所说的去做,这可能对他们有所帮助,也可以节省主题时间:

因此,您必须创建一个 伴随物伴随物伴随物伴随物来创建新的 新实例函数

你可以随意设置函数的参数。 使用

 val args = Bundle()

你可以设置你的参数。

现在可以使用 args.putSomthing添加参数,这些参数在 newInstance 函数中作为参数给出。 例如,putString(key:String,str:String)添加字符串等

现在,为了得到论点,你可以使用 就像 arguments.getString("1")

这里有一个完整的例子

class IntervModifFragment : DialogFragment(), ModContract.View
{
companion object {
fun newInstance(  plom:String,type:String,position: Int):IntervModifFragment {
val fragment =IntervModifFragment()
val args = Bundle()
args.putString( "1",plom)
args.putString("2",type)
args.putInt("3",position)
fragment.arguments = args
return fragment
}
}


...
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
fillSpinerPlom(view,arguments.getString("1"))
fillSpinerType(view, arguments.getString("2"))
confirmer_virme.setOnClickListener({on_confirmClick( arguments.getInt("3"))})




val dateSetListener = object : DatePickerDialog.OnDateSetListener {
override fun onDateSet(view: DatePicker, year: Int, monthOfYear: Int,
dayOfMonth: Int) {
val datep= DateT(year,monthOfYear,dayOfMonth)
updateDateInView(datep.date)
}
}


}
...
}

现在如何创建您的对话框,您可以在其他类中执行类似的操作

  val dialog = IntervModifFragment.newInstance(ListInter.list[position].plom,ListInter.list[position].type,position)

比如这个

class InterListAdapter(private val context: Context, linkedList: LinkedList<InterItem> ) : RecyclerView.Adapter<InterListAdapter.ViewHolder>()
{
...
override fun onBindViewHolder(holder: ViewHolder, position: Int) {


...
holder.btn_update!!.setOnClickListener {
val dialog = IntervModifFragment.newInstance(ListInter.list[position].plom,ListInter.list[position].type,position)
val ft = (context as AppCompatActivity).supportFragmentManager.beginTransaction()
dialog.show(ft, ContentValues.TAG)
}
...
}
..


}