[android] 조각에서 대화를 표시 하시겠습니까?

일반 대화 상자를 표시해야하는 조각이 있습니다. 이 대화 상자에서 사용자는 예 / 아니요 응답을 선택할 수 있으며 그에 따라 조각이 작동해야합니다.

이제 Fragment클래스에는 onCreateDialog()재정의 할 메서드 가 없으므로 포함 된 .NET Framework에서 대화 상자를 외부에 구현해야한다고 생각합니다 Activity. 괜찮지 만 Activity선택한 답변을 어떻게 든 조각에보고해야합니다. 물론 여기에서 콜백 패턴을 사용할 수 있으므로 조각 Activity은 리스너 클래스에 자신을 등록 하고 활동은이를 통해 응답을 다시보고합니다.

그러나 이것은 단편에 “간단한”예-아니오 대화 상자를 표시하는 것과 같은 간단한 작업에는 상당히 엉망인 것 같습니다. 또한, 이렇게하면 내 Fragment자급 자족이 줄어들 것입니다.

이를 수행하는 더 깨끗한 방법이 있습니까?

편집하다:

이 질문에 대한 대답은 DialogFragments를 사용하여 Fragments에서 대화 상자를 표시하는 방법을 자세히 설명하지 않습니다. 그래서 AFAIK,가는 길은 :

  1. 조각을 표시합니다.
  2. 필요한 경우 DialogFragment를 인스턴스화합니다.
  3. 을 사용하여 원본 조각을이 DialogFragment의 대상으로 설정합니다 .setTargetFragment().
  4. 원본 Fragment에서 .show ()를 사용하여 DialogFragment를 표시합니다.
  5. 사용자가이 DialogFragment에서 일부 옵션을 선택하면이 선택에 대해 원래 Fragment에 알리면 (예 : 사용자가 ‘yes’를 클릭) .getTarget ()을 사용하여 원래 Fragment의 참조를 가져올 수 있습니다.
  6. DialogFragment를 닫습니다.


답변

대신 DialogFragment 를 사용해야합니다 .


답변

DialogFragment를 사용하는 것이 최선의 선택이라는 이전에 받아 들여진 대답을 조심스럽게 의심해야합니다. DialogFragment의 목적으로 (주)의 목적은 조각을 표시하는 것 입니다 하지 디스플레이 조각에 자신을 대화 상자, 디스플레이 대화 상자를.

프래그먼트의 활동을 사용하여 대화와 프래그먼트 사이를 중재하는 것이 바람직한 옵션이라고 생각합니다.


답변

예 / 아니오 DialogFragment의 전체 예는 다음과 같습니다.

클래스:

public class SomeDialog extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
            .setTitle("Title")
            .setMessage("Sure you wanna do this!")
            .setNegativeButton(android.R.string.no, new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // do nothing (will close dialog)
                }
            })
            .setPositiveButton(android.R.string.yes,  new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // do something
                }
            })
            .create();
    }
}

대화를 시작하려면 :

        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        // Create and show the dialog.
        SomeDialog newFragment = new SomeDialog ();
        newFragment.show(ft, "dialog");

클래스가 onClickListener를 구현하고 포함 된 리스너 대신 사용하도록 할 수도 있습니다.

활동에 대한 콜백

콜백을 구현하려면 활동에서 수행되는 방법입니다.

YourActivity extends Activity implements OnFragmentClickListener

@Override
public void onFragmentClick(int action, Object object) {
    switch(action) {
        case SOME_ACTION:
        //Do your action here
        break;
    }
}

콜백 클래스 :

public interface OnFragmentClickListener {
    public void onFragmentClick(int action, Object object);
}

그런 다음 조각에서 콜백을 수행하려면 리스너가 다음과 같이 연결되어 있는지 확인해야합니다.

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mListener = (OnFragmentClickListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString() + " must implement listeners!");
    }
}

그리고 콜백은 다음과 같이 수행됩니다.

mListener.onFragmentClick(SOME_ACTION, null); // null or some important object as second parameter.


답변

저에게는 다음과 같습니다.

MyFragment :

public class MyFragment extends Fragment implements MyDialog.Callback
{
    ShowDialog activity_showDialog;

    @Override
    public void onAttach(Activity activity)
    {
        super.onAttach(activity);
        try
        {
            activity_showDialog = (ShowDialog)activity;
        }
        catch(ClassCastException e)
        {
            Log.e(this.getClass().getSimpleName(), "ShowDialog interface needs to be     implemented by Activity.", e);
            throw e;
        }
    }

    @Override
    public void onClick(View view)
    {
        ...
        MyDialog dialog = new MyDialog();
        dialog.setTargetFragment(this, 1); //request code
        activity_showDialog.showDialog(dialog);
        ...
    }

    @Override
    public void accept()
    {
        //accept
    }

    @Override
    public void decline()
    {
        //decline
    }

    @Override
    public void cancel()
    {
        //cancel
    }

}

MyDialog :

public class MyDialog extends DialogFragment implements View.OnClickListener
{
    private EditText mEditText;
    private Button acceptButton;
    private Button rejectButton;
    private Button cancelButton;

    public static interface Callback
    {
        public void accept();
        public void decline();
        public void cancel();
    }

    public MyDialog()
    {
        // Empty constructor required for DialogFragment
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View view = inflater.inflate(R.layout.dialogfragment, container);
        acceptButton = (Button) view.findViewById(R.id.dialogfragment_acceptbtn);
        rejectButton = (Button) view.findViewById(R.id.dialogfragment_rejectbtn);
        cancelButton = (Button) view.findViewById(R.id.dialogfragment_cancelbtn);
        acceptButton.setOnClickListener(this);
        rejectButton.setOnClickListener(this);
        cancelButton.setOnClickListener(this);
        getDialog().setTitle(R.string.dialog_title);
        return view;
    }

    @Override
    public void onClick(View v)
    {
        Callback callback = null;
        try
        {
            callback = (Callback) getTargetFragment();
        }
        catch (ClassCastException e)
        {
            Log.e(this.getClass().getSimpleName(), "Callback of this class must be implemented by target fragment!", e);
            throw e;
        }

        if (callback != null)
        {
            if (v == acceptButton)
            {
                callback.accept();
                this.dismiss();
            }
            else if (v == rejectButton)
            {
                callback.decline();
                this.dismiss();
            }
            else if (v == cancelButton)
            {
                callback.cancel();
                this.dismiss();
            }
        }
    }
}

활동:

public class MyActivity extends ActionBarActivity implements ShowDialog
{
    ..

    @Override
    public void showDialog(DialogFragment dialogFragment)
    {
        FragmentManager fragmentManager = getSupportFragmentManager();
        dialogFragment.show(fragmentManager, "dialog");
    }
}

DialogFragment 레이아웃 :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/dialogfragment_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="10dp"
        android:text="@string/example"/>

    <Button
        android:id="@+id/dialogfragment_acceptbtn"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/dialogfragment_textview"
        android:text="@string/accept"
        />

    <Button
        android:id="@+id/dialogfragment_rejectbtn"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_alignLeft="@+id/dialogfragment_acceptbtn"
        android:layout_below="@+id/dialogfragment_acceptbtn"
        android:text="@string/decline" />

     <Button
        android:id="@+id/dialogfragment_cancelbtn"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="20dp"
        android:layout_alignLeft="@+id/dialogfragment_rejectbtn"
        android:layout_below="@+id/dialogfragment_rejectbtn"
        android:text="@string/cancel" />

     <Button
        android:id="@+id/dialogfragment_heightfixhiddenbtn"
        android:layout_width="200dp"
        android:layout_height="20dp"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="20dp"
        android:layout_alignLeft="@+id/dialogfragment_cancelbtn"
        android:layout_below="@+id/dialogfragment_cancelbtn"
        android:background="@android:color/transparent"
        android:enabled="false"
        android:text=" " />
</RelativeLayout>

이름에서 알 수 있듯이 dialogfragment_heightfixhiddenbtn라고 말했지만 하단 버튼의 높이가 반으로 잘리는 것을 고칠 방법을 찾을 수 wrap_content없었기 때문에 대신에 숨겨진 버튼을 추가하여 반으로 “잘립니다”. 해킹 죄송합니다.


답변

 public void showAlert(){


     AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity());
     LayoutInflater inflater = getActivity().getLayoutInflater();
     View alertDialogView = inflater.inflate(R.layout.test_dialog, null);
     alertDialog.setView(alertDialogView);

     TextView textDialog = (TextView) alertDialogView.findViewById(R.id.text_testDialogMsg);
     textDialog.setText(questionMissing);

     alertDialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int which) {
             dialog.cancel();
         }
     });
     alertDialog.show();

}

여기서 .test_dialog는 xml 사용자 정의입니다.


답변

나는 초보자이고 솔직히 이해하거나 구현할 수있는 만족스러운 대답을 찾지 못했습니다.

여기 제가 원하는 것을 달성하는 데 도움이 된 외부 링크가 있습니다. 매우 간단하고 따라하기 쉽습니다.

http://www.helloandroid.com/tutorials/how-display-custom-dialog-your-android-application

코드로 달성하기 위해 시도한 것은 다음과 같습니다.

Fragment를 호스팅하는 MainActivity가 있습니다. 사용자 입력을 요청한 다음 그에 따라 입력을 처리하는 대화 상자가 레이아웃 상단에 나타나기를 원했습니다.
스크린 샷보기

내 조각의 onCreateView는 다음과 같습니다.

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_home_activity, container, false);

    Button addTransactionBtn = rootView.findViewById(R.id.addTransactionBtn);

    addTransactionBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Dialog dialog = new Dialog(getActivity());
            dialog.setContentView(R.layout.dialog_trans);
            dialog.setTitle("Add an Expense");
            dialog.setCancelable(true);

            dialog.show();

        }
    });

도움이 되길 바랍니다

혼동이 있으면 알려주세요. 🙂


답변

    public static void OpenDialog (Activity activity, DialogFragment fragment){

    final FragmentManager fm = ((FragmentActivity)activity).getSupportFragmentManager();

    fragment.show(fm, "tag");
}