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

그리고 Args를 이렇게 얻으십시오.

@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

10
@SIrCodealot 효과는 Activity 또는 Fragment에서 변수를 설정하는 것과 동일합니다. 회전 변경과 같이 DialogDragment를 파괴하고 다시 만드는 무언가에 직면하면 모든 변수를 잃게됩니다.
inmyth

2
이 경우에 오버로드 된 생성자가 사용되지 않는 이유를 궁금해하는 모든 사람들은 매우
유익한

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

1
감사합니다 ! Kotlin 버전이 도움이되었습니다.
ArdenDev

6

따라서 조각 / 활동에서 대화 조각으로 값을 전달하는 두 가지 방법이 있습니다.

  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>를 Bundle의 문자열로 전달할 수도 있습니다.
Jeffrey

@duggu, 왜 게터와 세터가 그렇게하는 가장 좋은 방법이 아닌가?
sky91

5

JafarKhQ가 언급했듯이 Fragments를 사용하는 일반적인 방법으로 생성자에 매개 변수를 전달하지 말고 Bundle .

Fragment클래스 의 내장 메소드 는 다음 setArguments(Bundle)과 같습니다.getArguments() 입니다.

기본적으로, 당신이하는 일은 당신의 모든 Parcelable아이템들과 함께 번들을 설정하고 그들을 보내는 것입니다.
그러면 Fragment가 해당 항목을 가져옵니다.onCreate 넣고 마법처럼 할 것입니다.

DialogFragment링크에 표시된 방식은 특정 유형의 데이터가있는 다중 나타나는 조각에서이 작업을 수행하는 한 가지 방법이며 대부분의 경우 잘 작동하지만 수동으로 수행 할 수도 있습니다.


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) setArguments (Bundle)을 사용하여 인수를 보내는 전체 목적은 메모리 부족 상황 등에서 손실 된 경우 OS가 조각을 다시 만들 수 있다는 것입니다. 솔루션을 사용하면 조각이 다시 생성되고 본문 텍스트가 사용 된 대화 상자의 마지막 인스턴스가 무엇이든 될 수 있습니다 (정적이므로). 올바른 해결책은 본문 텍스트를 번들 매개 변수로 설정하는 것입니다.
JHH

0

Kotlin을 사용하는 사람들을 위해 Kotlin에서 @JafarKhQ가 말한 작업을 수행하는 방법을 보여주고 싶습니다. 그 힘의 도움을 그들과 너무 테마 시간 저장 :

따라서 새로운 newInstance 함수 를 생성하려면 컴패니언 오브제 를 만들어야 합니다.

원하는 기능의 매개 변수를 설정할 수 있습니다. 사용

 val args = Bundle()

인수를 설정할 수 있습니다.

이제 args.putSomthingnewInstance 함수에서 prameter로 제공하는 인수를 추가 하는 데 사용할 수 있습니다 . 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.