2016-04-21 45 views
0

我有一個帶有自定義視圖的對話框片段。自定義視圖的背景顏色也會根據從newInstance()方法傳入的參數而變化。爲了確定它實際上是一個不同的DialogFragment實例,我還通過了另一個參數newInstance()方法,即對話框標題。背景顏色也可以接受null值,在這種情況下,不設置背景顏色。DialogFragment的充氣視圖正在下次使用中重用

現在問題是:當我第二次顯示帶有背景色的null值的對話框片段時,即使標題已經不同,膨脹的視圖仍然具有最後顯示的對話框片段的背景顏色。爲什麼系統重複使用最後一個充氣視圖?不應該背景顏色爲空?我沒有正確理解什麼?

MyDialogFragment.java

public static MyDialogFragment newInstance(String title, Integer bgColor) { 
    MyDialogFragment df = new MyDialogFragment(); 
    Bundle args = new Bundle(); 
    args.putString(TITLE_ARG, title); 
    args.putSerializable(BG_ARG, bgColor); 
    df.setArguments(args); 
    return df; 
} 

... 

@NonNull 
@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    Bundle args = getArguments(); 
    Integer bgColor = (Integer) args.getSerializable(BG_ARG); 
    View view = getActivity().getLayoutInflater().inflate(R.layout.my_dialog_fragment, null); 

    // check if null was passed 
    if(bgColor != null) 
     ((GradientDrawable) view.getBackground()).setColor(bgColor); 

    return new AlertDialog.Builder(getActivity()) 
      .setTitle(args.getString(TITLE_ARG)) 
      .setView(view) 
      .setNegativeButton(R.string.cancel, null) 
      .setPositiveButton(R.string.ok, null) 
      .create(); 
} 

MainActivity.java

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 

    findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      FragmentManager fm = getSupportFragmentManager(); 
      MyDialogFragment df = (MyDialogFragment) fm.findFragmentByTag(MyDialogFragment.TAG); 
      if(df == null) { 
       df = MyDialogFragment.newInstance("title1", Color.GREEN); 
       df.show(fm, MyDialogFragmentTAG); 
      } 
     } 
    }); 

    findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      FragmentManager fm = getSupportFragmentManager(); 
      MyDialogFragment df = (MyDialogFragment) fm.findFragmentByTag(MyDialogFragment.TAG); 
      if(df == null) { 
       df = MyDialogFragment.newInstance("title2", null); 
       df.show(fm, MyDialogFragmentTAG); 
      } 
     } 
    }); 

} 

回答

0

Button1的第一次點擊將產生對話框,它連接到FragmentManager。

點擊button2(第二次點擊)會找到你的舊片段,所以df不應該爲空,你不應該看到任何對話框。

也許你的代碼片段不完整。

+0

代碼片段很好。主活動上按鈕2的點擊意味着對話框片段已被解除。否則,如果仍然顯示對話框片段,則不能單擊button2。因此,單擊button2時df已爲空,因此會顯示一個新的對話框片段。 –

+0

你能分享所有的代碼嗎?我寫了一個小測試,它可以很好地使用'view.setBackgroundColor()'。 對於關閉的對話框你是對的,所以根本不需要搜索片段,在對話焦點時不能按下按鈕1或按鈕2。 –

+0

我沒有使用'view.setBackgroundColor()',因爲我在xml中爲'android:background'屬性使用了'Drawable'。我將製作單獨的項目和分享代碼。 –