Диалоговый фрагмент без FragmentActivity
Можно ли использовать DialogFragment
при использовании Activity
вместо FragmentActivity
? Для методов show()
требуется FragmentManager
.
Я хочу реализовать Dialog, который содержит только один EditText
, а в учебниках по разработчикам Android говорится, что я должен использовать собственный макет для фрагмента диалога. Поэтому я спросил, почему мне не хочется менять FragmentActivity
только на 1 диалог.
РЕШИТЬ:
Я решил использовать FragmentActivity
вместо Activity
, чтобы он не усложнился.
Ответы
Ответ 1
Я столкнулся с той же проблемой. Я знаю, что вы спросили об этом год назад, но по-прежнему помогать другим пользователям. Вот как я решил проблему.
public void show_dialog() {
FragmentManager fm = getFragmentManager();
DialogFragment newFragment = new DialogFragment();
newFragment.show(fm, "abc");
}
Для этого требуется импорт FragmentManager, а не FragmentActivity.
Ответ 2
Может быть, немного поздно, но у меня также возникла проблема вызвать DialogFragment из не FragmentActivity. Также сделать это FragmentActivity просто для простого диалога не имеет смысла. Таким образом, решение для меня состояло в том, чтобы создать интерфейс с обратным вызовом, чтобы получить ответ DialogFragment в действии. Для меня лучше получить ответ рядом с диалоговым вызовом, а не получать его где-нибудь в переопределении onActivityResult.
Интерфейс:
import android.os.Parcelable;
/**
* Created by TH on 03.11.2015.
*/
public interface OnDialogResponseListener extends Parcelable {
void onDialogResponse(int responseCode);
}
Общий класс диалога:
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
/**
* Code basisc found here:
* http://stackoverflow.com/questions/7977392/android-dialogfragment-vs-dialog
* changed by TH on 03.11.2015.
*/
public class YesNoDialog extends DialogFragment
{
public static final String TITLE="title";
public static final String MESSAGE="message";
public static final String LISTENER="listener";
public static final String YES="yes";
public static final String NO="no";
public static final String ICON_ID="icon_id";
private OnDialogResponseListener mResponseListener;
public YesNoDialog()
{
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
Bundle args = getArguments();
String title = args.getString(TITLE, "");
String message = args.getString(MESSAGE, "");
String yes = args.getString(YES, "");
String no = args.getString(NO, "");
int iconID=args.getInt(ICON_ID);
mResponseListener=args.getParcelable(LISTENER);
return new AlertDialog.Builder(getActivity())
.setTitle(title)
.setMessage(message)
.setIcon(iconID)
.setPositiveButton(yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (mResponseListener != null) {
mResponseListener.onDialogResponse(Activity.RESULT_OK);
}
}
})
.setNegativeButton(no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (mResponseListener != null) {
mResponseListener.onDialogResponse(Activity.RESULT_CANCELED);
}
}
})
.create();
}
}
И использование будет таким:
OnDialogResponseListener onDialogResponseListener=new OnDialogResponseListener() {
@Override
public int describeContents() {
return 0; //Leave this as it is
}
@Override
public void writeToParcel(Parcel dest, int flags) {
//Leave this as it is
}
@Override
public void onDialogResponse(int responseCode) {
//Do what you want with your dialog answers
if(responseCode== Activity.RESULT_OK){
Toast.makeText(MovementActivity.this,"OK pressed",Toast.LENGTH_LONG).show();
}else if(responseCode==Activity.RESULT_CANCELED){
Toast.makeText(MovementActivity.this,"CANCEL pressed",Toast.LENGTH_LONG).show();
}
}
};
YesNoDialog dialog = new YesNoDialog();
Bundle args = new Bundle();
args.putInt(YesNoDialog.ICON_ID, R.drawable.ic_action_add_light);
args.putString(YesNoDialog.YES, getString(R.string.action_add));
args.putString(YesNoDialog.NO, getString(R.string.action_cancel));
args.putString(YesNoDialog.TITLE, getString(R.string.dialog_title_add_item));
args.putString(YesNoDialog.MESSAGE, getString(R.string.dialog_message_add_item));
args.putParcelable(YesNoDialog.LISTENER, onDialogResponseListener);
dialog.setArguments(args);
dialog.show(getSupportFragmentManager(), "tag");
Вот и все. Может быть, немного больше кода, чем в simle Dialog, но он сохраняет свои значения и показывает изменения ориентации. Это была моя цель использовать DialogFragment.
Ответ 3
Если вам нужен всеобъемлющий диалог для всех ваших фрагментов, просто используйте обычный диалоговый код для действий с активностью фрагмента. В противном случае просто реализуйте его в диалоговом окне "Диалог" в качестве дочернего элемента "Фрагментная активность".
Ответ 4
У меня была такая же проблема, но мне удалось исправить ее с помощью ответов в столбце переполнения, связанного ниже. Мне особенно понравилось решение mrolcsi с концепцией слушателя положительного/отрицательного результата, который дал мне очень аккуратный результат.
Получить значение из диалогового окна