5

Tôi đang cố gắng sử dụng hộp thoại theo chủ đề vật chất mới với các đoạn trong AppCompat v22.1. According to Chris Banes, để làm điều này:DialogFragment với AppCompatDialog bị treo nếu STYLE_NO_TITLE được đặt

Chỉ cần trở new AppCompatDialog(getActivity(), getTheme()) từ onCreateDialog(Bundle).

Thiết này lên:

public class MyFragment extends DialogFragment 
{ 
    public MyFragment() { } 

    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     return new AppCompatDialog(getActivity(), getTheme()); 
    } 

    ... 
} 

công trình một cách hoàn hảo trong trường hợp bình thường; hộp thoại chính xác theo chủ đề và mọi thứ. Tuy nhiên, khi chúng tôi cố gắng để hiển thị một hộp thoại với các STYLE_NO_TITLE tùy chọn:

MyFragment fragment = new MyFragment(); 
fragment.setStyle(DialogFragment.STYLE_NO_TITLE, 0); 
fragment.show(getSupportFragmentManager(), "DIALOG"); 

nó gây ra ngoại lệ sau đây và sụp đổ:

05-19 12:18:38.806 15458-15458/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.example.test.testdialog, PID: 15458 
android.util.AndroidRuntimeException: requestFeature() must be called before adding content 
    at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:302) 
    at android.app.Dialog.requestWindowFeature(Dialog.java:1066) 
    at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:317) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138) 
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740) 
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501) 
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:458) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5254) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Tôi đoán các vấn đề có thể liên quan đến DialogFragment gọi requestWindowFeature() thay vì supportRequestWindowFeature() (?)

Có giải pháp nào cho vấn đề này không?

+2

liên quan đến điều này: https://code.google.com/p/android/issues/detail?id=170053? – Blackbelt

+0

@Blackbelt Vâng, chắc chắn là như vậy, cảm ơn. – matiash

+0

Bạn được chào đón – Blackbelt

Trả lời

3

Đây là một lỗi trong AppCompat v22.1 mà là fixed in v22.1.1.

Nó lại vi phạm trong v23 và was fixed once more, in v23.0.1.

Nó hoạt động bình thường khi viết bài này.

+0

bất kỳ ý tưởng nào về sự cố hộp thoại đoạn này với v23.0.1? http://stackoverflow.com/questions/32813894/v7-support-23-0-1-crash-appcompatbutton-setbackgrounddrawable –

2

Theo các vấn đề từ liên kết của Blackbelt chúng ta nên trả về AppCompatDialog và sử dụng supportRequestWindowFeature(). Tôi đề nghị thay đổi như thế này:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AppCompatDialog dialog = new AppCompatDialog(getActivity(), getTheme()); 
    return dialog; 
} 

@Override 
public void setupDialog(Dialog dialog, int style) { 
    switch (style) { 
     case STYLE_NO_INPUT: 
      dialog.getWindow().addFlags(
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
          WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 
      // fall through... 
     case STYLE_NO_FRAME: 
     case STYLE_NO_TITLE: 
      ((AppCompatDialog) dialog).supportRequestWindowFeature(Window.FEATURE_NO_TITLE); 
    } 
} 

hoặc tốt hơn, cố gắng không để liên lạc mã gốc:

@Override 
public void setupDialog(Dialog dialog, int style) { 
    super.setupDialog(dialog,style); 
    if(style == STYLE_NO_TITLE) 
     ((AppCompatDialog) dialog).supportRequestWindowFeature(Window.FEATURE_NO_TITLE); 
} 
+0

Cảm ơn. Trên thực tế, đây là lỗi trong thư viện hỗ trợ và đã được sửa. – matiash

+0

Bạn cứu tôi khỏi rất nhiều đau đầu ... – Pedram

Các vấn đề liên quan