Android DialogFragment无碎片活动
当使用Android DialogFragment无碎片活动,android,android-activity,dialogfragment,Android,Android Activity,Dialogfragment,当使用活动而不是片段活动时,是否可以使用对话框片段?show()方法需要一个FragmentManager 我想实现一个只包含一个EditText的对话框,android开发者的教程说我必须在对话框片段上使用自定义布局。所以我问了,因为我不想改变使用FragmentActivity只针对一个对话框 已解决: 我决定只使用FragmentActivity而不是Activity,这样它就不会变得更复杂。如果您需要一个用于所有片段的总体对话框,只需使用带有片段活动的普通for活动。否则,只需将其作为片
活动
而不是片段活动
时,是否可以使用对话框片段
?show()
方法需要一个FragmentManager
我想实现一个只包含一个EditText
的对话框,android开发者的教程说我必须在对话框片段上使用自定义布局。所以我问了,因为我不想改变使用FragmentActivity
只针对一个对话框
已解决:
我决定只使用
FragmentActivity
而不是Activity
,这样它就不会变得更复杂。如果您需要一个用于所有片段的总体对话框,只需使用带有片段活动的普通for活动。否则,只需将其作为片段活动的子级在DialogFragment中实现。我遇到了同样的问题。我知道你一年前问过这个问题,但仍然是为了帮助其他用户。这就是我解决问题的方法
public void show_dialog() {
FragmentManager fm = getFragmentManager();
DialogFragment newFragment = new DialogFragment();
newFragment.show(fm, "abc");
}
这只需要FragmentManager导入,而不是FragmentActivity。我也遇到了同样的问题,但通过下面链接的堆栈溢出帖子中的答案,我成功地解决了这个问题。我特别喜欢mrolcsi的解决方案,它采用了积极/消极结果侦听器的概念,根据我的说法,它给出了一个非常简洁的结果
可能有点晚,但我也遇到了从非碎片活动调用DialogFragment的问题。仅仅为了一个简单的对话而把它变成一个零碎的活动是没有意义的。因此,我的解决方案是创建一个带有回调void的接口,以获取活动中的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对话框中的代码多一点,但它保持其值并在方向更改时显示。这就是我使用DialogFragment的目标。非常简单,只需使用getSupportFragmentManager()
请编辑您的问题,因为它不够清楚。您是否试图通过扩展活动类来实现DialogFragment?否,我试图在扩展活动的自定义类上使用DialogFragment。教程说自定义类应该扩展FragmentActivity而不是Activity。所以我在问我是否可以做,你试过吗?遇到任何问题?如果使用V7支持库,则需要调用“getSupportFragmentManager()”。非常感谢你!注意!从2021年起,它需要最低API级别11,而不是公认的答案-
getFragmentManager()
不再有效。
DialogConfirmRequest dialogConfirmRequest = new DialogConfirmRequest("Sem conexão com a internet");
dialogConfirmRequest.setCancelable(true);
dialogConfirmRequest.show(getSupportFragmentManager() ,"meudialog");