передача аргумента в DialogFragment
мне нужно передать некоторые переменные в DialogFragment, Так что я могу выполнить действие. Затмение предполагает, что я должен использовать
Fragment#setArguments(Bundle)
но я не знаю как использовать эту функцию. Как я могу использовать его для передачи переменных в мой диалог?
6 ответов:
используя
newInstancepublic 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"); ... }Смотрите полный пример here
http://developer.android.com/reference/android/app/DialogFragment.html
я использовал, чтобы отправить некоторые значения из моего 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; } });как получить внутри метода onCreate () DialogFragment
Bundle mArgs = getArguments(); String nameTrife = mArgs.getString("tar_name"); String nameFav = mArgs.getString("fav_name"); String name = "";// Котлин загрузки
val fm = fragmentManager val dialogFragment = AddProgFargmentDialog() // my custom FargmentDialog var args: Bundle? = null args?.putString("title", model.title); dialogFragment.setArguments(args) dialogFragment.show(fm, "Sample Fragment")/ / receive
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (getArguments() != null) { val mArgs = arguments var myDay= mArgs.getString("title") } }
как общий способ работы с фрагментами, как отметил Джафаркхк, вы не должны передавать параметры в конструкторе, но с
Bundle.встроенный метод для этого в
FragmentклассsetArguments(Bundle)иgetArguments().в основном, то, что вы делаете, это настроить пакет со всеми вашими
Parcelableэлементы и отправить их дальше.
в свою очередь, ваш фрагмент получит эти элементы в немonCreateи сделать это волшебство для них.путь, показанный в
DialogFragmentссылка один из способов сделать это в мульти появляющемся фрагменте с одним конкретным типом данных и работает нормально большую часть времени, но вы также можете сделать это вручную.
таким образом, существует два способа передачи значений из фрагмента/действия в фрагмент диалога:-
создать объект фрагмента диалога с помощью метода Make setter и передать значение / аргумент.
передать значение / аргумент через пакет.
Способ 1:
// 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 }Примечание:- это не лучший способ сделать
Способ 2:
// 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 }Примечание.:- Это лучший способ сделать.
в моем случае ни один из кодов выше
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"); [...] }
просто я хочу показать, как сделать то, что сказал @JafarKhQ в Котлине для тех, кто использует Котлин это может помочь им и сэкономить время темы тоже:
так что вы должны создать компаньон objet создать новый newInstance функции
вы можете установить paremter функции все, что вы хотите. используя
val args = Bundle()вы можете установить свои аргументы.
теперь вы можете использовать
args.putSomthingчтобы добавить вам args, которые u дайте как prameter в вашей функции newInstance.putString(key:String,str:String)добавить строку например и так далеетеперь, чтобы получить аргумент, который вы можете использовать
arguments.getSomthing(Key: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) } ... } .. }
Comments