2015-10-20 31 views
8

我有一个片段,我需要显示一个自定义对话框。在添加内容之前必须请求窗口功能,同时在片段中实现对话框

请查看我的代码如下。

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) 
+0

尝试在onstart中设置onClick侦听器 –

+0

将您的AppCompat版本更新到v22.1.0 – MKJParekh

回答

-2

原谅我,如果我不直接回答你的问题,但我会推荐一个备用解决方案。

我没有直接使用AppCompatDialog,但我用AppCompatTheme使用了AlertDialog。我发现AlertDialog在使用方面非常简单。

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

希望它有帮助。

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生成器来代替。现在只需使用DialogFragment,但如果使用v7 Builder和自定义setView,则会得到一个AppCompatDialog。

0

您的错误是一个错误,它已在支持库23.0.1中修复。你可以尝试用v7 AlertDialog.BuilderonCreateDialog()

@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(); 
} 
1

我实现了,并试图为你这样的情况,许多替代,它的工作真的很好,所以我不能得到一个机会来审查你的错误。但我可以建议你替换AppCompatDialogAlertDialog.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

你必须使用下面的代码来设置自定义视图在警报dialog.This代码是在我的项目中工作。

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

在我的情况下,图书馆不得不对程序兼容性v23.1.1库的依赖性。强制库使用我当前版本的应用程序compat库修复了这个问题。

要查看您可以使用下面的命令的依赖性层次结构:

gradlew -p MODULE_NAME dependencies 

其中module_name是你的应用程序模块的名称(通常只是“应用”)

要强制库升级依赖关系:

compile('com.example.m:m:1.0') { 
    exclude group: 'com.android.support', module: 'appcompat-v7' 
} 
相关问题