我正在尝试使用DialogFragment在Android中显示一个基本对话框,使用对话框消息的参数,如StackOverflow线程和DialogFragment文档中所述.我的问题是onCreateDialog中的Bundle参数savedInstanceState始终显示为null,这意味着该活动显示一个空对话框而不是带有消息的对话框.如何从newInstance工厂方法获取非null的bundle内容以显示在onCreateDialog中?或者我只是遗漏了别的东西?
我从文档中看到的唯一重要区别是我使用的是非静态类.我希望积极的对话框按钮取决于消息的内容,所以这是故意的.
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
public class SampleDialog extends DialogFragment {
public static final String DIALOG_MESSAGE = "dialogMessage";
private String dialogMessage;
// arguments are handled through factory method with bundles for lifecycle maintenance
public SampleDialog(){
}
public static SampleDialog newInstance(String dialogMessage){
SampleDialog fragment = new SampleDialog();
Bundle args = new Bundle();
args.putString(DIALOG_MESSAGE, dialogMessage);
fragment.setArguments(args);
return fragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
if(savedInstanceState != null) {
dialogMessage = …Run Code Online (Sandbox Code Playgroud) 似乎任何使用Marshmallow(Android 6.0)的人都无法DatePicketDialog在我的应用程序中使用.似乎遇到了某种我遇到的主题问题.我用一个DialogFragment包含一个DatePicketDialog供用户选择生日.以下是Android 5.x和6.x的DialogFragment镜头.
我试图在DatePickerDialog构造函数中添加一个主题,但这使得DialogFragment全屏,我不希望这样.有谁知道我怎么能看到DatePickerDialog它像棉花糖之前?
更新1
这是我创建的代码DialogFragment:
DialogFragment ageFragment = new DatePickerDialogFragment();
ageFragment.show(getFragmentManager(), "datePicker");
Run Code Online (Sandbox Code Playgroud)
这是onCreateDialog里面的DatePickerDialogFragment:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker if no filters are set
Calendar cal = Calendar.getInstance();
// Set the date 18 years previous, since only 18 and older are allowed on the app
cal.add(Calendar.YEAR, -18);
int year, …Run Code Online (Sandbox Code Playgroud) 在我的对话框片段中,我能够显示键盘使用
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT STATE_VISIBLE);
Run Code Online (Sandbox Code Playgroud)
但我无法隐藏它dismiss.
我试过了
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
Run Code Online (Sandbox Code Playgroud)
和
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Run Code Online (Sandbox Code Playgroud)
两者都不起作用.
我也尝试使用显示和隐藏键盘
InputMethodManager inputManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.toggleSoftInput(0, 0);
Run Code Online (Sandbox Code Playgroud)
和
InputMethodManager inputManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
Run Code Online (Sandbox Code Playgroud)
但这些无法显示或隐藏键盘.
public static class MyDialogFragment extends DialogFragment
{
@Nullable @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.inflate(R.layout.my_input_dialog, container, false);
}
@Override
public void onViewCreated(View v, Bundle savedInstanceState)
{
super.onViewCreated(v, savedInstanceState);
final EditText editText = (EditText)v.findViewById(R.id.input);
// this line below is able to show the keyboard
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Button add = (Button)v.findViewById(R.id.add_btn);
add.setOnClickListener(new …Run Code Online (Sandbox Code Playgroud) android android-softkeyboard android-dialogfragment dialogfragment
我有一个从DialogFragment派生的自定义对话框.
当用户单击确定按钮时,我需要保存屏幕上的信息.
所以我使我的PositiveButton调用dismiss并且我实现了onDismiss方法来保存数据.
在onDismiss方法中,我需要从Dialog上的editView获取数据.我使用getView().findViewByID得到EditView中,但该方法GetView()返回null.
这是我的代码:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
builder.setView(inflater.inflate(R.layout.dialog_signin, null))
.setPositiveButton(R.string.signin, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
LoginDialogFragment.this.getDialog().dismiss();
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
LoginDialogFragment.this.getDialog().cancel();
}
});
return builder.create();
}
@override
public void onDismiss(){
EditView view = (EditView)getView().findViewByID(R.id.edit);
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以将OnCreateDialog中膨胀的视图保存为属性,但这对我来说似乎不对.
如何在onDismiss中从屏幕上获取视图的正确方法?
Ps:我工作的地方不允许我发布我的代码,因此我从谷歌中获取了代码并将其更改为尽可能接近我的代码.
我正在学习 Android 编程的基础知识,但在使用 NumberPicker 时遇到了一些问题。
\n\n我已经接近我想要的了,对话框打开,小时和分钟数字选择器出现,但它们上面和下面没有数字可供滚动。我也无法使用弹出的键盘编辑数字。我尝试添加 onValueChange 侦听器,但当我使用键盘时它没有生成任何事件。
\n\n任何人都可以提供有关如何解决此问题的建议吗?到目前为止,我注意到我尝试使用某些活动或片段中的小部件执行很多操作,而这些特定类不支持这些操作。
\n\n以下是相关代码和图像的片段:
\n\n我有一个带有两个按钮的 ClockActivity 类:
\n\n...\npublic class ClockActivity extends ActionBarActivity {\n\n...\n\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n super.onCreate(savedInstanceState);\n setContentView(R.layout.activity_clock);\n\n // Define gui objects\n ...\n mWorkForTime = (Button)findViewById(R.id.work_for_time);\n mBreakForTime = (Button)findViewById(R.id.break_for_time);\n\n // Add listeners for the work for/break for buttons\n mWorkForTime.setOnClickListener(new View.OnClickListener() {\n @Override\n public void onClick(View v) {\n // Bring up the picker fragment\n DialogFragment newFragment = TimePickerFragment.newInstance(R.string.work_title);\n newFragment.show(getSupportFragmentManager(), "WorkTimePicker");\n }\n });\n mBreakForTime.setOnClickListener(new View.OnClickListener() {\n @Override\n public void onClick(View …Run Code Online (Sandbox Code Playgroud) 我面临着通过 DialogFragment 显示片段的问题。事实上,在我的应用程序中,我使用一些片段来显示应用程序的内容。
对于智能手机,我直接在 FrameLayout 中实例化我的片段。对于平板电脑,我将通过 DialogFragment 显示一些内容。我的想法是重用我的片段来保留它的视图和行为。并将其转换为 DialogFragment 以便能够访问 DialogFragment 行为。
我尝试创建一个 DialogFragment,显示用于实例化我的片段的 FrameLayout,但这种方式似乎不可能。
我找不到其他方法可以做到这一点。
有人有解决这个问题的方法吗?
我最近完成了一个项目的构建,我的下一个目标是专门为 RTL 创建一个构建风格,一个重要的注意事项是我需要强制 RTL 布局,独立于设备语言。
所以我设法使用视图方法setLayoutDirection在大多数应用程序上强制 RTL并旋转所有不合作的视图,但由于某种原因,我无法镜像应用程序中的对话框,这些对话框仅在设备语言更改。我试图翻转 onCreateDialog 中的对话框,访问返回 null 的 getView,但我不确定我还能做什么......
有人可以帮我将 DialogFragment 翻转到 RTL 吗?
谢谢。
我在全屏显示自定义DialogFragment时遇到一些问题.此对话框具有可滚动且具有autocompletetextview的内容.
最初显示的对话框顶部有一个边距 - 以编程方式设置为布局内容顶部的透明视图.一旦autocompletetextview被聚焦,该边距就会减少到0(从而产生对话框以全屏模式进入的错觉).此时键盘也显示出来.
目前,键盘缩小了对话框的大小,对话框上的按钮向上移动,位于键盘上方.这会产生一个问题,因为只要autocompletetextview失去焦点,对话框就会调整大小,并且由于键盘调整大小也会创建一个闪烁:它们隐藏了键盘 - >对话框在底部移动 - >对话框调整为全屏 - >对话框resisez到初始大小
当前创建的对话框:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
if (!hasTitle()) {
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
}
// the content
//final RelativeLayout root = new RelativeLayout(getActivity());
//root.setLayoutParams(
// new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
//dialog.setContentView(root);
if (position != null) {
WindowManager.LayoutParams windowParams = dialog.getWindow().getAttributes();
windowParams.x = position.x;
windowParams.y = position.y;
dialog.getWindow().setAttributes(windowParams);
} else {
dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(hasTitle() ? Color.WHITE : Color.TRANSPARENT));
dialog.getWindow().setGravity(Gravity.TOP | Gravity.START);
return dialog;
}
Run Code Online (Sandbox Code Playgroud)
这部分工作,因为对话框没有填充宽度,它要小得多.
有些东西可以解决这个问题,但它会产生另一个问题:
@Override …Run Code Online (Sandbox Code Playgroud) 我一直在让我的对话框片段在显示键盘时不调整大小/折叠时遇到问题。我在使用 Android 30 这样的特定 API 时遇到了这个问题,但在使用 Android 27 这样的旧 API 时却没有遇到这个问题。我在下面提供了屏幕截图,我可以确认他会影响我的特定 API 应用程序中的所有对话框片段。
编辑:Tom Ladek 指出此问题仅发生在 SDK 30 上。SDK 29 及以下不受影响。
android dialog android-fragments dialogfragment android-studio