Передача аргумента в DialogFragment
Мне нужно передать некоторые переменные в DialogFragment
, поэтому я могу выполнить действие. Eclipse предполагает, что я должен использовать
Fragment#setArguments(Bundle)
Но я не знаю, как использовать эту функцию. Как я могу использовать его для передачи переменных в мой диалог?
Ответы
Ответ 1
Используя 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;
}
И получим такие Args как
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNum = getArguments().getInt("num");
...
}
См. полный пример здесь
http://developer.android.com/reference/android/app/DialogFragment.html
Ответ 2
как общий способ работы с фрагментами, как отметил JafarKhQ, вам не следует передавать параметры в конструкторе, но с Bundle
.
встроенный метод для класса Fragment
- setArguments(Bundle)
и getArguments()
.
в основном, то, что вы делаете, настраивает пакет со всеми вашими элементами Parcelable
и отправляет их.
в свою очередь, ваш фрагмент получит те элементы в нем onCreate
и сделает это волшебство для них.
способ, показанный на ссылке DialogFragment
, был одним из способов сделать это в многопользовательском фрагменте с одним конкретным типом данных и отлично работает отлично, но вы также можете сделать это вручную.
Ответ 3
Я использовал для отправки некоторых значений из своего списка
Как отправить
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;
}
});
и как получить внутри метода onCreate() диалогового окна
Bundle mArgs = getArguments();
String nameTrife = mArgs.getString("tar_name");
String nameFav = mArgs.getString("fav_name");
String name = "";
Ответ 4
В моем случае ни один из вышеприведенного кода с 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");
[...]
}