DialogFragmentに引数を渡す


116

いくつかの変数をに渡してDialogFragment、アクションを実行できるようにする必要があります。Eclipseは私が使うべきだと示唆しています

Fragment#setArguments(Bundle)

しかし、この関数の使い方がわかりません。変数をダイアログに渡すにはどうすればよいですか?


回答:


299

使用する 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


バンドルを使用する代わりに、MyDialogFragmentにプライベート変数を設定できますか?
SIr Codealot、2015

10
@SIrCodealotの効果は、ActivityまたはFragmentに変数を設定するのと同じです。回転の変更のようなDialogDragmentを破壊して再作成する何かに直面すると、すべての変数が失われます。
インミース2015年

2
:オーバーロードされたコンストラクタはこの場合に使用されていない理由を不思議すべての人のために、非常に有益であるトピックに関する別の議論を参照stackoverflow.com/questions/14011808/...
HondaGuy

savedInstanceStateが使用されていないことに気付くまでに少し時間かかりました
Odys

25

以前はリストビューからいくつかの値を送信していました

どのように送信します

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
より良い答え!
user55924 2018年

1
ありがとうございました !Kotlinバージョンが役立ちました。
ArdenDev

6

したがって、フラグメント/アクティビティからダイアログフラグメントに値を渡す方法は2つあります。

  1. make setterメソッドを使用してダイアログフラグメントオブジェクトを作成し、値/引数を渡します。

  2. 値/引数をバンドルに渡します。

方法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
}

注:-これが最善の方法です。


Gsonライブラリを使用して、ObjectsまたはArrayList <Objects>をバンドル内の文字列として渡すこともできます。
ジェフリー

@duggu、なぜゲッターとセッターがそうするための最良の方法ではないのですか?
sky91

5

JafarKhQが指摘したように、フラグメントを操作する一般的な方法として、コンストラクターではなく、でパラメーターを渡す必要がありBundleます。

Fragmentクラスの組み込みメソッドはsetArguments(Bundle)and getArguments()です。

基本的に、あなたがすることはあなたのすべてのParcelableアイテムでバンドルをセットアップしてそれらを送ることです。
次に、フラグメントはそれらのアイテムを取得onCreateし、魔法をかけます。

DialogFragmentリンクに示されている方法は、1つの特定のタイプのデータを含む複数のフラグメントでこれを行う1つの方法であり、ほとんどの場合正常に機能しますが、これを手動で行うこともできます。


0

私の場合、上記のコードはどれも機能しません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");

[...]
}

1)bodyTextを静的に格納することにより、このクラスの2つのインスタンスを、異なる本文で同時に持つことは事実上不可能になります。代わりにインスタンス変数として保存しない理由はありません。2)setArguments(Bundle)を使用して引数を送信する目的は、OSがメモリ不足の状況でフラグメントが失われた場合に備えてフラグメントを再作成できることです。ソリューションを使用すると、フラグメントが再作成され、本文テキストが再作成されます使用されているダイアログの最後のインスタンスが何であっても(静的であるため)。正しい解決策は、本文テキストをバンドルパラメータとして設定することです。
JHH 2016年

0

私は使う人のためにKotlinで言ったん何@JafarKhQを行う方法を示したいだけのことkotlinあまりにも彼らを助けるとテーマ時間保存可能性があります。

新しいnewInstance関数を作成するには、対応するオブジェクトを作成する必要があります

関数のパラメーターは、好きなように設定できます。を使用して

 val args = Bundle()

引数を設定できます。

これでを使用args.putSomthingして、newInstance関数のパラメーターとしてuが与える引数を追加できます。 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)
        }
        ...
    }
..

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.