在片段中实现对话框时,必须在添加内容之前请求窗口功能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在片段中实现对话框时,必须在添加内容之前请求窗口功能相关的知识,希望对你有一定的参考价值。
我有一个片段,我需要在其中显示自定义对话框。
请查看下面的代码。
public class MyFragment extends Fragment{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.send_layout, container, false);
TextView txtView = (TextView) rootView.findViewById(R.id.tv);
txtView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openDialog();
}
});
return rootView;
}
public void openDialog(){
AppCompatDialog dialog = new AppCompatDialog(getContext(), R.style.package_types__dialog);
dialog.setContentView(R.layout.package_types_dialog);
dialog.show();
}
}
删除行时:
dialog.setContentView(R.layout.package_types_dialog);
没有错误,但如果我使用相同的以下错误抛出:
FATAL EXCEPTION: main
10-20 19:42:57.489 23866-23866/in.edelworks.pickedup E/androidRuntime: Process: in.edelworks.pickedup, PID: 23866
10-20 19:42:57.489 23866-23866/in.edelworks.pickedup E/AndroidRuntime: android.util.AndroidRuntimeException: Window feature must be requested before adding content
10-20 19:42:57.489 23866-23866/in.edelworks.pickedup E/AndroidRuntime: at android.support.v7.app.AppCompatDelegateImplV7.throwFeatureRequestIfSubDecorInstalled(AppCompatDelegateImplV7.java:1584)
10-20 19:42:57.489 23866-23866/in.edelworks.pickedup E/AndroidRuntime: at android.support.v7.app.AppCompatDelegateImplV7.requestWindowFeature(AppCompatDelegateImplV7.java:509)
10-20 19:42:57.489 23866-23866/in.edelworks.pickedup E/AndroidRuntime: at android.support.v7.app.AppCompatDelegateImplBase.onCreate(AppCompatDelegateImplBase.java:117)
10-20 19:42:57.489 23866-23866/in.edelworks.pickedup E/AndroidRuntime: at android.support.v7.app.AppCompatDelegateImplV7.onCreate(AppCompatDelegateImplV7.java:148)
10-20 19:42:57.489 23866-23866/in.edelworks.pickedup E/AndroidRuntime: at android.support.v7.app.AppCompatDialog.onCreate(AppCompatDialog.java:60)
10-20 19:42:57.489 23866-23866/in.edelworks.pickedup E/AndroidRuntime: at android.app.Dialog.dispatchOnCreate(Dialog.java:361)
10-20 19:42:57.489 23866-23866/in.edelworks.pickedup E/AndroidRuntime: at android.app.Dialog.show(Dialog.java:262)
我已经为你的情况实施并尝试了很多替代方案,它的工作非常好,所以我没有机会审查你的错误。但我可以建议你用AppCompatDialog
替换AlertDialog.Builder
,这是一类android.support.v7.app
。
替换此代码
public void openDialog(){
AppCompatDialog dialog = new AppCompatDialog(getContext(), R.style.package_types__dialog);
dialog.setContentView(R.layout.package_types_dialog);
dialog.show();
}
同
public void openDialog(){
AlertDialog.Builder dialog = new AlertDialog.Builder(getContext(),R.style.package_types__dialog);
dialog.setView(R.layout.package_types_dialog);
}
注意 :
如果你有任何处理dialog
事件的类,那么扩展DialogFragment
的android.support.v4.app.DialogFragment
。并且不要忘记覆盖onCreateDialog
方法。完整的课程看起来像这样
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
/**
* Created by Shreekrishna on 2/29/2016.
*/
public class PackageTypesDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return super.onCreateDialog(savedInstanceState);
}
}
这可能会解决您的问题!
覆盖onCreateDialog并改为使用v7 AlertDialog Builder。要么
AlertDialog.Builder bulder = new AlertDialog.Builder(this);
bulder
.setCancelable(false)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
bulder.setTitle("Title");
bulder.setView(getLayoutInflater().inflate(R.layout.dialog, null));
AlertDialog dialog = bulder.create();
dialog.show();
这是库版本23.0.0上出现的错误,并在版本23.0.1中发布了修复程序。但有些用户报告说问题仍然存在。
您可以尝试的一件事是覆盖onCreateDialog并使用v7 AlertDialog Builder。现在只使用DialogFragment,但如果您使用v7 Builder和自定义setView,您将获得AppCompatDialog。
您的错误是一个错误,它已在支持库23.0.1中修复。你可以试试v7 AlertDialog.Builder
onCreateDialog()
:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Simple Dialog");
builder.setMessage("Some message here");
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
}
});
return builder.create();
}
您必须使用下面的代码在警报对话框中设置自定义视图。此代码适用于我的项目。
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
// ...Irrelevant code for customizing the buttons and title
LayoutInflater inflater = this.getLayoutInflater();
View dialogView = inflater.inflate(R.layout.alert_label_editor, null);
dialogBuilder.setView(dialogView);
EditText editText = (EditText) dialogView.findViewById(R.id.label_field);
editText.setText("test label");
AlertDialog alertDialog = dialogBuilder.create();
alertDialog.show();
就我而言,库依赖于appcompat v23.1.1库。强制库使用我当前版本的app compat库修复了该问题。
要查看依赖项heirarchy,您可以使用以下命令:
gradlew -p MODULE_NAME dependencies
MODULE_NAME是您的应用模块的名称(通常只是'app')
要强制库升级依赖项:
compile('com.example.m:m:1.0') {
exclude group: 'com.android.support', module: 'appcompat-v7'
}
请原谅我,如果我没有直接回答你的问题,但我会推荐一个替代解决方案。
我没有直接使用AppCompatDialog,但我已将AlertDialog与AppCompatTheme一起使用。我发现AlertDialog在使用它方面非常简单。
回答here给出了一个如何使用AlertDialog的很好的例子。
希望能帮助到你。
以上是关于在片段中实现对话框时,必须在添加内容之前请求窗口功能的主要内容,如果未能解决你的问题,请参考以下文章
如何使用对象列表在片段中实现newinstace模式[重复]