我有一个自定义对话框。所以单击按钮我正在显示它。现在我在自定义对话框中有一个按钮,我想在单击该按钮时关闭它,但它抛出任何空指针异常。这是我的代码用来显示它:
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) 我已经按照此链接制作了自定义对话框,并且它的工作正常。但后来我想添加动画,使它看起来像从屏幕的顶部到底部。所以我搜索了这两个动画并找到了它们并将它们放在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) 不确定我是否遗漏了一些明显的东西,但是当显示对话框时,我无法在父屏幕中获取灰色叠加背景。使用此代码创建一个全新的应用程序:
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) 我有一个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
在官方示例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
我以前扩展了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
我尝试从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
在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
我想要一个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
我可以使用PopupWindow而不是Dialog来调暗背景吗?我问这个是因为我正在使用Dialogs,但Dialog没有显示在点击的项目下面,并且PopupWindow我已经在项目下面显示了弹出窗口.
android dialog popupwindow android-dialog android-popupwindow
android ×10
android-dialog ×10
callback ×1
customdialog ×1
dialog ×1
overlay ×1
popupwindow ×1