标签: android-dialog

在 Android 中单击按钮时关闭自定义对话框

我有一个自定义对话框。所以单击按钮我正在显示它。现在我在自定义对话框中有一个按钮,我想在单击该按钮时关闭它,但它抛出任何空指针异常。这是我的代码用来显示它:

private void showPreConfirmationDialog() {
    final Dialog dialog= new Dialog(context);;
    button = (ImageView) findViewById(R.id.bookButton);
    button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {

            dialog.setContentView(R.layout.pre_confirmation_dailog);
            //dialog.setCancelable(false);
            dialog.setTitle("OnWard Details...");
            dialog.show();

        }
    });

    backPreConfirmation = (ImageView)dialog.findViewById(R.id.backImage);
    backPreConfirmation.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            dialog.dismiss();

        }
    });
}
Run Code Online (Sandbox Code Playgroud)

单击 backPreConfirmation 按钮时,它会抛出我的此错误:

07-30 09:25:15.830: E/AndroidRuntime(26599): FATAL EXCEPTION: main
07-30 09:25:15.830: E/AndroidRuntime(26599): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.result/com.android.result.Result}: java.lang.NullPointerException
07-30 09:25:15.830: E/AndroidRuntime(26599):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
07-30 09:25:15.830: E/AndroidRuntime(26599):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-30 09:25:15.830: E/AndroidRuntime(26599):    at android.app.ActivityThread.access$600(ActivityThread.java:141) …
Run Code Online (Sandbox Code Playgroud)

android android-dialog

6
推荐指数
1
解决办法
2万
查看次数

动画在自定义对话框中不起作用

我已经按照此链接制作了自定义对话框,并且它的工作正常。但后来我想添加动画,使它看起来像从屏幕的顶部到底部。所以我搜索了这两个动画并找到了它们并将它们放在anim文件夹中。所以为了在我的自定义对话框中应用它们,我稍微改变了构造函数。我在自定义对话框的构造函数中添加了这一行

 public AnimationDialog(Activity a, int drawable) {
    super(a);
    // TODO Auto-generated constructor stub
    this.c = a;
    this.mDrawable = drawable;
    this.getWindow().getAttributes().windowAnimations = R.style.DialogSlideAnim;
}
Run Code Online (Sandbox Code Playgroud)

以下行是我为实现动画而添加的内容,如上所示

this.getWindow().getAttributes().windowAnimations = R.style.DialogSlideAnim;

但没有任何反应,我的对话框显示为默认情况

这是我的样式文件供参考

 <style name="DialogAnimation">
    <item name="android:windowEnterAnimation">@anim/slide_down_animation</item>
    <item name="android:windowExitAnimation">@anim/slide_up_animation</item>
</style>

<!-- Animation for dialog box -->
<style name="DialogSlideAnim" parent="@android:style/Theme.Dialog">
    <item name="android:windowAnimationStyle">@style/DialogAnimation</item>
</style>
Run Code Online (Sandbox Code Playgroud)

但是我的动画仍然无法正常工作,我做错了什么,?请告诉我我怎样才能做到这一点?如何为我的自定义对话框设置动画。

编辑

这是我的下滑动画

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromYDelta="0%p"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toYDelta="100%p" />

</set>
Run Code Online (Sandbox Code Playgroud)

这是我的向上滑动动画

 <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromYDelta="100%"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toXDelta="0" />
</set>
Run Code Online (Sandbox Code Playgroud)

android android-animation customdialog android-dialog

6
推荐指数
1
解决办法
8304
查看次数

Jetpack Compose 对话框不显示灰色叠加层

不确定我是否遗漏了一些明显的东西,但是当显示对话框时,我无法在父屏幕中获取灰色叠加背景。使用此代码创建一个全新的应用程序:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            TestsTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    Column(modifier = Modifier.fillMaxSize()) {
                        Greeting("Android")
                    }

                    CustomDialog()
                }
            }
        }
    }
}

@Composable
fun CustomDialog() {
    var showDialog by remember { mutableStateOf(true) }
    if (showDialog) {
        Dialog(onDismissRequest = {
            showDialog = !showDialog
        }) {
            Column(modifier = Modifier.fillMaxWidth()
                .background(color = Color.Red)) {
                Text(text = "Hello …
Run Code Online (Sandbox Code Playgroud)

android overlay android-dialog android-jetpack-compose

6
推荐指数
1
解决办法
1470
查看次数

如何从处理程序显示DialogFragment

我有一个Handler,它在收到特定消息时显示DialogFragment.这通常有效,但如果片段已经保存,我会收到以下错误:

E/AndroidRuntime(3898):FATAL EXCEPTION:main E/AndroidRuntime(3898):java.lang.IllegalStateException:在onSaveInstanceState E/AndroidRuntime(3898)之后无法执行此操作:at android.support.v4.app.FragmentManagerImpl.checkStateLoss (FragmentManager.java:1299)E/AndroidRuntime(3898):在android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310)E/AndroidRuntime(3898):在android.support.v4.app.BackStackRecord .commitInternal(BackStackRecord.java:541)E/AndroidRuntime(3898):在android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525)E/AndroidRuntime(3898):at android.support.v4.app .DialogFragment.show(DialogFragment.java:123)E/AndroidRuntime(3898):at com.malauzai.app.BaseActivity $ 2.handleMessage(BaseActivity.java:72)E/AndroidRuntime(3898):at android.os.Handler.在DispatchMessage(Handler.java:99)

现在,我知道这是预期的,基于Javadoc for FragmentManager.beginTransaction:

注意:只能在活动保存其状态之前创建/提交片段事务.如果您尝试在Activity.onSaveInstanceState()之后(以及之后的Activity.onStart或Activity.onResume()之前提交事务,则会出现错误.这是因为框架负责将当前片段保存在状态中,如果在状态保存后进行了更改,则它们将丢失.

我的问题是,我不知道如何防止它.我试过打电话Handler.removeMessages()onPause(),但它仍然存在.我已尝试设置一个标志,onSaveInstanceState()如果已设置则不显示该片段,但它仍然会发生.这似乎是一个非常常见的问题,但我无法想出一个有效的解决方案.基本上,我如何知道该片段已被保存?

顺便说一句,这发生在我的BaseActivity(扩展FragmentActivity)上,但是每个活动都有自己的处理程序,所以我认为这不应该是一个问题.

我最后的想法是使用Fragment.commitAllowingStateLoss(),但这似乎是一个黑客.

编辑: 这是导致我出现问题的代码:

private final Handler mTimerHandler = new Handler() {
      @Override
      public void handleMessage(Message msg) {
        switch (msg.what) {
        case TIMER_MESSAGE_LOGOUT_WARNING:
            // throws IllegalStateException if fragment is already saved
            new LogoutWarningDialog().show(getSupportFragmentManager(),
                    "dialog");
            break;
        }
      }
};
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-dialog android-dialogfragment

5
推荐指数
1
解决办法
2115
查看次数

DailogFragment - getArguments/setArguments - 为什么在包中传递参数?

在官方示例http://developer.android.com/reference/android/app/DialogFragment.html#BasicDialog中,使用静态工厂方法创建片段,该方法包装Bundle中的参数并调用no-args构造函数传递args with setArguments(bundle) - 所以我的问题是 - 为什么不简单地用这些参数创建公共构造函数?使用getArguments/setArguments片段的方法的原因是什么 - 可能是Dialog不能保证每次都重新创建,但重用?如果是的话那么什么时候发生?提前致谢.

android android-fragments android-dialog android-dialogfragment

5
推荐指数
1
解决办法
3138
查看次数

如何在DialogFragment中忽略"搜索"键按下

我以前扩展了Dialog我的对话框的类,我不得不在对话框中使用以下代码段,以便在按下手机的搜索键时不会将其解除:

setOnKeyListener(new OnKeyListener()
{
  public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event)
  {
    if (keyCode == KeyEvent.KEYCODE_SEARCH)
      return true; // pretend we've processed it
    else
      return false; // pass on to be processed as normal
  }
});
Run Code Online (Sandbox Code Playgroud)

我现在正在使用DialogFragment该类进行对话.不幸的是,当按下电话的搜索键时(不管对话框的可取消状态如何),对话框被解除时DialogFragment存在同样的问题.双重问题在于没有方法,因此上述代码段不再适用.DialogDialogFragmentsetOnKeyListener

任何人都知道如何让我的对话框(显示时)忽略搜索键按下?

注意:我尝试将上面的代码段添加到我的activity的onKeyUp 方法中,但不幸的onKeyUp是,如果DialogFragment显示实例,则不会调用我的activity的方法.相反,令人恼火的DialogFragment是,这个 例子被驳回了.

android android-keypad android-fragments android-dialog android-dialogfragment

5
推荐指数
1
解决办法
1532
查看次数

onAttach()从未在DialogFragment中调用过

我尝试从a实现回调DialogFragment.有一个很好的例子,但他们不会DialogFragment从一个开放Fragment. http://developer.android.com/guide/topics/ui/dialogs.html#PassingEvents

所以这是我的代码:

public class EditDateDialogFragment extends DialogFragment {
    // Use this instance of the interface to deliver action events
    EditDateDialogListener mListener;

    /* The activity that creates an instance of this dialog fragment must
     * implement this interface in order to receive event callbacks.
     * Each method passes the DialogFragment in case the host needs to query it. */
    public interface EditDateDialogListener {
        public void onDialogPositiveClick(DialogFragment dialog);
        public void onDialogNegativeClick(DialogFragment dialog);
    }


    public static …
Run Code Online (Sandbox Code Playgroud)

android callback android-fragments android-dialog android-dialogfragment

5
推荐指数
2
解决办法
6107
查看次数

如何将ActionBarCompat Activity显示为在AndroidManifest.xml中设置其主题的对话框?

Android开发者文档介绍如何设置一个Dialog主题为Activity:

提示:如果需要自定义对话框,则可以Activity将对话框显示为对话框,而不是使用DialogAPI.只需创建一个活动并将其主题设置Theme.Holo.Dialog<activity>manifest元素:

<activity android:theme="@android:style/Theme.Holo.Dialog" >

而已.活动现在显示在对话窗口而不是全屏.

我正在尝试为使用ActionBarCompat的应用程序执行此操作.我一直在尝试不同的主题,比如......

android:theme="@android:style/Theme.Dialog"
android:theme="@style/Theme.AppCompat.Base.CompactMenu.Dialog"
android:theme="@style/Theme.AppCompat.CompactMenu.Dialog"
Run Code Online (Sandbox Code Playgroud)

但是,由于我最终得到相同的错误消息,它们似乎都没有工作:

java.lang.IllegalStateException:您需要将Theme.AppCompat主题(或后代)与此活动一起使用.

android android-theme illegalstateexception android-dialog android-actionbar-compat

5
推荐指数
1
解决办法
4637
查看次数

包含片段的AppCompat样式对话框

我想要一个AppCompat风格的对话框 - 背景,标题,按钮位置,按钮色调等 - 包含片段.

使用自定义DialogFragment onCreateDialog()可以返回一个AppCompatDialog,然后在onCreateView()新的布局中可以膨胀并childFragmentManager可以用于用Fragment替换占位符视图.但是生成的对话框是一个没有按钮的空框.可以手动将它们添加到对话框的布局中,但它们不会从AppCompat中获得样式.

如果您使目标片段扩展,则同样适用DialogFragment.

要获得AppCompat按钮,您可以使用AlertDialog.Builder.setView()来设置布局,但是我找不到将Fragment设置为内容的方法.如果你从那时开始尝试childFragmentManager.beginTransaction().replace(),onCreateDialog()你会得到:

 java.lang.IllegalStateException: Fragment does not have a view
Run Code Online (Sandbox Code Playgroud)

这似乎是因为,即使在使用builder.setView()dialog.create() 随后dialog.setView(), onCreateView()并且getView()总是返回null.

这里的第二个答案似乎非常全面地涵盖了这一点,但没有提出有利的解决方案:https://stackoverflow.com/a/21418952/2645845

如果您覆盖onCreateView()getView()返回您膨胀的视图,那么您会得到:

 android.util.AndroidRuntimeException: Window feature must be requested before adding content
    at android.support.v7.app.AppCompatDelegateImplV7.throwFeatureRequestIfSubDecorInstalled(AppCompatDelegateImplV7.java:1479)
Run Code Online (Sandbox Code Playgroud)

android android-appcompat android-fragments android-dialog appcompatdialog

5
推荐指数
0
解决办法
702
查看次数

在Android中使用PopupWindow调暗背景

我可以使用PopupWindow而不是Dialog来调暗背景吗?我问这个是因为我正在使用Dialogs,但Dialog没有显示在点击的项目下面,并且PopupWindow我已经在项目下面显示了弹出窗口.

android dialog popupwindow android-dialog android-popupwindow

5
推荐指数
2
解决办法
5668
查看次数