문제

규칙적인 대화를 보여줄 필요가있는 조각이 있습니다. 이 대화 상자에서 사용자는 예/아니오 답을 선택할 수 있으며 그에 따라 조각이 그에 따라 행동해야합니다.

이제 Fragment 수업에는 없습니다 onCreateDialog() 재정의하는 방법, 그래서 나는 포함 된 대화에서 대화 상자를 구현해야한다고 생각한다. Activity. 괜찮아요 Activity 선택한 답변을 어떻게 든 조각에보고해야합니다. 물론 여기서 콜백 패턴을 사용할 수 있으므로 조각이 자체적으로 등록합니다. Activity 청취자 수업을 사용하면 활동이 그 답을 다시보고합니다.

그러나 이것은 단편에 "간단한"예-아니오 대화를 표시하는 것처럼 간단한 작업에 대해 상당히 큰 혼란 인 것 같습니다. 또한 이런 식으로 내 Fragment 덜 자 급식이 될 것입니다.

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

편집하다:

이 질문에 대한 답은 대화 방송을 사용하여 조각에서 대화를 표시하는 방법에 대해 자세히 설명하지 않습니다. 그래서 Afaik,가는 길은 다음과 같습니다.

  1. 조각을 표시하십시오.
  2. 필요할 때 대화식을 인스턴스화하십시오.
  3. 원래 조각을이 대화 대상의 대상으로 설정하고 .setTargetFragment().
  4. 원래 조각에서 .show ()로 대화식을 표시하십시오.
  5. 사용자 가이 대화 대상에서 일부 옵션을 선택하면 원본 조각 에이 선택에 대해 알리면 (예 : 사용자가 '예'를 클릭 한) .getTarget ()로 원본 조각의 참조를 얻을 수 있습니다.
  6. 대화 형식을 무시합니다.
도움이 되었습니까?

해결책

당신은 a를 사용해야합니다 대화 조종 대신에.

다른 팁

대화 대상을 사용하는 것이 최선의 선택이라는 이전에 인정 된 답변을 신중하게 의심해야합니다. 대화 형식의 의도 된 (1 차) 목적은 ~이다 대화 자체가 그 조각을 표시하지 않습니다 가지다 표시 할 대화 상자.

나는 대화 상자의 활동을 사용하여 대화 상자와 조각을 중재하는 것이 바람직한 옵션이라고 생각합니다.

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

클래스:

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

대화식 레이아웃 :

<?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-endroid-application

이것은 내가 코드로 달성하려고 시도한 것입니다.

나는 조각을 호스팅하는 메인 활동이 있습니다. 레이아웃 위에 대화 상자가 나타나서 사용자 입력을 요청한 다음 입력을 그에 따라 처리하기를 원했습니다.스크린 샷을 참조하십시오

내 조각의 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");
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top