2015-10-20 30 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' 
} 
相關問題