조각에서 대화 상자를 표시 하시겠습니까?
정기적 인 대화 상자를 표시 해야하는 조각이 있습니다. 이 대화 상자에서 사용자는 예 / 아니오 답변을 선택할 수 있으며 그에 따라 조각이 작동해야합니다.
이제 Fragment
클래스에는 onCreateDialog()
재정의 할 메소드 가 없으므로 포함 대화 상자 외부에서 대화 상자를 구현해야한다고 생각합니다 Activity
. 괜찮지 만 Activity
선택한 답변을 어떻게 든 단편에 다시보고해야합니다. 물론 여기서 콜백 패턴을 사용할 수 있으므로 프래그먼트 Activity
가 리스너 클래스에 등록되고 Activity는 그 또는 그와 같은 것을 통해 답을보고합니다.
그러나 이것은 "단순"예-아니오 대화 상자를 조각으로 표시하는 것처럼 간단한 작업에는 큰 혼란으로 보입니다. 또한이 방법은 내 Fragment
자급자가 덜 될 것입니다.
이 작업을 수행하는 더 확실한 방법이 있습니까?
편집하다:
이 질문에 대한 답은 실제로 DialogFragments를 사용하여 Fragments의 대화 상자를 표시하는 방법을 자세히 설명하지는 않습니다. AFAIK는 갈 길입니다 :
- 단편을 표시하십시오.
- 필요한 경우 DialogFragment를 인스턴스화하십시오.
- 을 사용하여 원본 조각을이 DialogFragment의 대상으로 설정하십시오
.setTargetFragment()
. - 원본 조각의 .show ()를 사용하여 DialogFragment를 표시하십시오.
- 사용자가이 DialogFragment에서 일부 옵션을 선택하면이 선택에 대해 원본 조각에 알립니다 (예 : 사용자가 'yes'를 클릭 한 경우). .getTarget ()을 사용하여 원본 조각의 참조를 얻을 수 있습니다.
- 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
'programing tip' 카테고리의 다른 글
브라우저 디버깅을 허용하도록 웹팩 구성 (0) | 2020.07.24 |
---|---|
RGB를 회색조 / 강도로 변환 (0) | 2020.07.24 |
"제목"속성의 툴팁 표시 속도 변경 (0) | 2020.07.24 |
팻 JAR이란 무엇입니까? (0) | 2020.07.24 |
src AND 컨텐츠가 포함 된 스크립트 태그는 무엇을 의미합니까? (0) | 2020.07.24 |