programing tip

조각에서 대화 상자를 표시 하시겠습니까?

itbloger 2020. 7. 24. 07:51
반응형

조각에서 대화 상자를 표시 하시겠습니까?


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

이제 Fragment클래스에는 onCreateDialog()재정의 메소드 가 없으므로 포함 대화 상자 외부에서 대화 상자를 구현해야한다고 생각합니다 Activity. 괜찮지 만 Activity선택한 답변을 어떻게 든 단편에 다시보고해야합니다. 물론 여기서 콜백 패턴을 사용할 수 있으므로 프래그먼트 Activity가 리스너 클래스에 등록되고 Activity는 그 또는 그와 같은 것을 통해 답을보고합니다.

그러나 이것은 "단순"예-아니오 대화 상자를 조각으로 표시하는 것처럼 간단한 작업에는 큰 혼란으로 보입니다. 또한이 방법은 내 Fragment자급자가 덜 될 것입니다.

이 작업을 수행하는 더 확실한 방법이 있습니까?

편집하다:

이 질문에 대한 답은 실제로 DialogFragments를 사용하여 Fragments의 대화 상자를 표시하는 방법을 자세히 설명하지는 않습니다. AFAIK는 갈 길입니다 :

  1. 단편을 표시하십시오.
  2. 필요한 경우 DialogFragment를 인스턴스화하십시오.
  3. 을 사용하여 원본 조각을이 DialogFragment의 대상으로 설정하십시오 .setTargetFragment().
  4. 원본 조각의 .show ()를 사용하여 DialogFragment를 표시하십시오.
  5. 사용자가이 DialogFragment에서 일부 옵션을 선택하면이 선택에 대해 원본 조각에 알립니다 (예 : 사용자가 'yes'를 클릭 한 경우). .getTarget ()을 사용하여 원본 조각의 참조를 얻을 수 있습니다.
  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
    }

}

내 대화 상자 :

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 custom입니다.


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

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

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

이 코드로 달성하려고 시도한 것 :

I have a MainActivity that hosts a Fragment. I wanted a dialog to appear on top of the layout to ask for user input and then process the input accordingly. See a screenshot

Here's what the onCreateView of my fragment looks

@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();

        }
    });

I hope it will help you

Let me know if there's any confusion. :)


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

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

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

참고URL : https://stackoverflow.com/questions/5393197/show-dialog-from-fragment

반응형