我有一个浮动对话框的对话框片段,其中包含一个特殊的键盘,当用户按下EditText字段时会弹出(正常的IME停止显示).
当用户按下后退按钮(就像使用普通的IME服务一样)时,我希望键盘被解除(visibility = GONE),但对话框仍然可见.然而,就我在SO和其他地方的相当广泛的阅读中所看到的,似乎没有办法做到这一点.
如果我将对话框设置为不可取消,那么我不会被onCancel()或onDismiss()通知,因为该对话框不可取消.
如果我将对话框设置为可取消,则会收到通知,但对话框将被取消.
我无法将onKeyListener附加到片段中的对话框,因为它被系统替换,以便片段可以处理对话框的生命周期.
有没有办法做到这一点?或者,为了Fragment系统的目的,是否可以访问完全围起来的关键事件的检测?
在开发Android应用程序时,我已经读过,建议使用DialogFragment而不是直接使用AlertDialog来显示警报和确认.
例如,在DialogFragment的文档中完成此操作:http://developer.android.com/reference/android/app/DialogFragment.html
人们还说他们更喜欢这个: Android DialogFragment vs Dialog
我想知道这种方法的优点,因为代码变得更加复杂.
谢谢
android android-alertdialog android-dialogfragment dialogfragment
我有一个DialogFragment,我在onActivityCreated方法中为进入/退出设置动画,如下所示
@Override
public void onActivityCreated(Bundle arg0) {
super.onActivityCreated(arg0);
getDialog().getWindow()
.getAttributes().windowAnimations = R.style.DialogAnimation;
}
Run Code Online (Sandbox Code Playgroud)
我的DialogAnimation样式文件如下
<style name="DialogAnimation">
<item name="android:windowEnterAnimation">@android:anim/fade_in</item>
<item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
Run Code Online (Sandbox Code Playgroud)
这对我有用......
现在我的问题是我希望有两个不同的退出动画,一个用于点击确定按钮,一个用于取消按钮.所以我做的是我尝试在解雇之前更改转换,但它没有工作..任何解决方案如何实现......这就是我的尝试.
@Override
public void onClick(View v) {
getDialog().getWindow()
.getAttributes().windowAnimations = R.style.DialogAnimation2;
this.dismiss();
}
Run Code Online (Sandbox Code Playgroud) 我有一个IllegalStateException展示DialogFragment:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
Run Code Online (Sandbox Code Playgroud)
我知道它为什么会发生但我想通过重写DialogFragment 函数使用commitAllowingStateLoss来显示对话框show:
public void show(FragmentManager manager, String tag) {
mDismissed = false;
mShownByMe = true;
FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commit(); //replace it by commitAllowingStateLoss
}
Run Code Online (Sandbox Code Playgroud)
但我不访问mDismissed和mShownByMe变量,我如何访问这些变量来修改它们,就像它的父母一样.
android android-fragments android-dialogfragment dialogfragment
在 DialogFragment() 中使用 Android 视图绑定的正确方法是什么?
官方文档只提到了 Activity 和 Fragment:https : //developer.android.com/topic/libraries/view-binding
我如何听取最后解雇BottomSheetDialogFragment?我想在最终解雇时保存用户更改...
我试过以下:
方法1
如果通过向下滑动对话框解除对话(不在背面按压或外面触摸),则仅触发此操作
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
Dialog d = super.onCreateDialog(savedInstanceState);
d.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
BottomSheetDialog d = (BottomSheetDialog) dialog;
FrameLayout bottomSheet = (FrameLayout) dialog.findViewById(android.support.design.R.id.design_bottom_sheet);
BottomSheetBehavior behaviour = BottomSheetBehavior.from(bottomSheet);
behaviour.setState(BottomSheetBehavior.STATE_EXPANDED);
behaviour.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_HIDDEN)
{
// Bottom Sheet was dismissed by user! But this is only fired, if dialog is swiped down! Not if touch outside dismissed the …Run Code Online (Sandbox Code Playgroud) android dialog android-dialogfragment dialogfragment bottom-sheet
我创建了一个自定义对话框片段及其xml,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:padding="5dip" >
<ListView
android:id="@+id/product_list"
android:background="@drawable/border_details"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<RelativeLayout
android:id="@+id/AddtoCart"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginTop="10dp"
android:background="#005959" >
<Button
android:id="@+id/button_addToCart"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@drawable/gradient_button"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:text="@string/add_to_cart"
android:textColor="#000000" />
</RelativeLayout>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
当我调用此对话框时,它将按照屏幕截图中的全屏显示:

如何将此对话框的大小限制为列表和按钮的高度?
如何删除多余的空白区域?
是否有可能使用DialogFragment使用时Activity的替代FragmentActivity?这些show()方法需要一个FragmentManager.
我想实现一个只包含一个的Dialog,EditTextAndroid开发人员的教程说我必须在对话框片段上使用自定义布局.所以我问因为我不想改变只使用FragmentActivity1个对话框.
解决:我决定使用FragmentActivity而不是Activity这样,它不会变得更复杂.
我有一个函数,当触发时,成功显示一个DialogFragment与以下代码
DialogFragment
DialogFragment dialog;
View dialogView;
Context activityContext;
...
dialog = new DialogFragment(){
@Override public Dialog onCreateDialog(Bundle savedInstanceState) {
dialogView = getActivity().getLayoutInflater().inflate(R.layout.customView, null);
...
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(dialogView);
return builder.create();
}
};
dialog.show(activityContext.getSupportFragmentManager() , "MyDialog");
Run Code Online (Sandbox Code Playgroud)
问题是,在我添加一个带有以下代码的系统警报窗口后,DialogFragment不再显示,但是如果我传递到另一个应用程序,当我的应用程序最小化时,我可以看到DialogFragment,同时它减小了它的大小
系统警报窗口
WindowManager mWindowManager;
WindowManager.LayoutParams params;
...
mWindowManager = (WindowManager)activityContext.getSystemService(Context.WINDOW_SERVICE);
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT
}
params.gravity = Gravity.CENTER_VERTICAL | Gravity.RIGHT;
addView(((LayoutInflater)activityContext.getSystemService("layout_inflater")).inflate(R.layout.floatingBotton, null));
Run Code Online (Sandbox Code Playgroud)
那么......为什么我不能在顶部看到我的对话框(据我所知,对话框正在显示)为什么它只在显示系统警报窗口时发生
我已尝试使用系统警报窗口的其他标志,但我遇到了与我尝试过的问题相同的问题
android android-dialogfragment dialogfragment system-alert-window
显示ProgressDialog时崩溃应用程序.我正在使用滑出式键盘在手机上进行测试.当显示对话框时,我滑动键盘和应用程序崩溃.
public static class ProgressDialogFragment extends DialogFragment
{
public ProgressDialogFragment()
{
super();
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
final ProgressDialog dialog = new ProgressDialog(getActivity());
dialog.setMessage(getString(R.string.dlg_progress_title));
dialog.setIndeterminate(true);
dialog.setCancelable(false);
return dialog;
}
@Override
public void show(FragmentManager manager, String tag)
{
try
{
super.show(manager, tag);
}
catch (IllegalStateException e)
{
Log.d(TAG, e.getMessage());
}
}
}
Run Code Online (Sandbox Code Playgroud)
崩溃日志:
> 04-25 20:49:46.999: E/AndroidRuntime(7904): FATAL EXCEPTION: main
04-25 20:49:46.999: E/AndroidRuntime(7904): java.lang.NullPointerException
04-25 20:49:46.999: E/AndroidRuntime(7904): at android.support.v4.app.DialogFragment.dismissInternal(DialogFragment.java:184)
04-25 20:49:46.999: E/AndroidRuntime(7904): at android.support.v4.app.DialogFragment.dismissAllowingStateLoss(DialogFragment.java:165)
04-25 20:49:46.999: E/AndroidRuntime(7904): at com.fisherman.activity.HomeActivity$2.onPostExecute(HomeActivity.java:268) …Run Code Online (Sandbox Code Playgroud) android nullpointerexception android-fragments dialogfragment