3

我在這一塊上碰壁了。除了使用客戶適配器的對話框之外,我的DialogFragment與我所有的其他對話框都能很好地協作。第二次更改方向時,我得到一個java.lang.IllegalStateException: Fragment NewAlertDialog{447bc528} not attached to Activity這是使用API​​ 4+支持包。帶適配器的DialogFragment顯示AlertDialog無法在方向更改中生存

它不會在第一取向發生變化,它總是發生在第二,這意味着它發生在這個次序的對話框顯示:

  • 人像 - >景觀 - >肖像 - > Java的。 lang.IllegalStateException
  • 風景 - >縱向 - >景觀 - > java.lang.IllegalStateException

下面是對話:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
     final DialogItem[] items = { 
       new DialogItem(getString(R.string.test1), R.drawable.test1), 
       new DialogItem(getString(R.string.test2), R.drawable.test2), 
      }; 
     ListAdapter adapter = new ArrayAdapter<DialogItem>(getActivity(), 
      android.R.layout.select_dialog_item, 
      android.R.id.text1, 
      items){ 
       public View getView(int position, View convertView, ViewGroup parent) { 
        View v = super.getView(position, convertView, parent); 
        TextView tv = (TextView)v.findViewById(android.R.id.text1); 
        tv.setCompoundDrawablesWithIntrinsicBounds(items[position].icon, 0, 0, 0); 
        int dp10 = (int) (10 * getResources().getDisplayMetrics().density + 0.5f); 
        tv.setCompoundDrawablePadding(dp10); 
        return v; 
       } 
      }; 
     return new AlertDialog.Builder(getActivity()) 
        .setTitle(R.string.title) 
        .setIcon(R.drawable.icon) 
        .setAdapter(adapter, new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int item) { 
          if (item == 0) 
           doThis(); 
          else 
           doThat(); 
         } 
        }).create(); 
} 

這是一個DialogItem:

class DialogItem { 
    public final String text; 
    public final int icon; 
    public DialogItem(String text, Integer icon) { 
     this.text = text; 
     this.icon = icon; 
    } 
    @Override 
    public String toString() { 
     return text; 
    } 
} 

我知道這是因爲如果我從AlertDialog.Builder刪除.setAdapter()呼叫然後問題消失含適配器的問題。

奇怪的是,我的ICS設備沒有問題。這隻發生在我測試的薑餅裝置上。任何幫助是極大的讚賞!

謝謝!

Matt。

回答

2

問題已解決。調用getResources()資源關閉Activity而不是DialogFragment是必要的改變。

前:

int dp10 = (int) (10 * getResources().getDisplayMetrics().density + 0.5f); 

後:

int dp10 = (int) (10 * getActivity().getResources().getDisplayMetrics().density + 0.5f); 
相關問題