在片段中实现对话框时,必须在添加内容之前请求窗口功能

问题描述 投票:8回答:7

我有一个片段,我需要在其中显示自定义对话框。

请查看下面的代码。

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)
android android-fragments
7个回答
1
投票

我已经为你的情况实施并尝试了很多替代方案,它的工作非常好,所以我没有机会审查你的错误。但我可以建议你用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事件的类,那么扩展DialogFragmentandroid.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);
    }
}

这可能会解决您的问题!


0
投票

覆盖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();

0
投票

这是库版本23.0.0上出现的错误,并在版本23.0.1中发布了修复程序。但有些用户报告说问题仍然存在。

Source

您可以尝试的一件事是覆盖onCreateDialog并使用v7 AlertDialog Builder。现在只使用DialogFragment,但如果您使用v7 Builder和自定义setView,您将获得AppCompatDialog。


0
投票

您的错误是一个错误,它已在支持库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();
}

0
投票

您必须使用下面的代码在警报对话框中设置自定义视图。此代码适用于我的项目。

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();

0
投票

就我而言,库依赖于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'
}

-2
投票

请原谅我,如果我没有直接回答你的问题,但我会推荐一个替代解决方案。

我没有直接使用AppCompatDialog,但我已将AlertDialog与AppCompatTheme一起使用。我发现AlertDialog在使用它方面非常简单。

回答here给出了一个如何使用AlertDialog的很好的例子。

希望能帮助到你。

© www.soinside.com 2019 - 2024. All rights reserved.