2012-12-25 20 views
2

我有一個ListFragment,名爲MeasurementList它顯示所有註冊的測量數據。使用名爲的New DialogFragment註冊新測量數據Im使用AlertDialog中的定製視圖以及需要填寫的所需UI控件的NewMeasurement更新ListFragment(父)中的列表,並更改DialogFragment AlertDialog

現在,我需要一個優雅的解決方案,在DialogFragment關閉後更新ListFragment中的測量列表並使用新的已註冊測量。我不想從數據庫更新列表,而只是將新創建的Measurement對象添加到列表中。我試圖遵循Android指南,瞭解如何通過回調接口將片段與活動進行通信(Creating event callbacks to the activity)。 MeasurementList將其引用傳遞給NewMeasurement,以便在註冊新度量後可以將其回調。問題是如何將監聽器引用保存在NewMeasurement.newInstance()方法中的Bundle中。它主要保存原始數據類型而不是像我這樣的對象。

任何提示和建議,將不勝感激。

MeasurementList.java

public class MeasurementList extends ListFragment implements OnMeasurementSetListener { 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.addMeasurement: 
       NewMeasurement newMeasurementDialog = NewMeasurement.newInstance(this); 
       newMeasurementDialog.show(getFragmentManager(), "newMeasurementDialog"); 
       break; 
      default: 
       break; 
     } 
     return true; 
    } 

    @Override 
    public void onMeasurementSet(Measurement measurement) { 
     MeasurementAdapter listAdapter = (MeasurementAdapter) getListAdapter(); 
     listAdapter.add(measurement); 
    } 
} 

OnMeasurementSetListener.java

public interface OnMeasurementSetListener { 
    public abstract void onMeasurementSet(Measurement measurement); 
} 

NewMeasurement.java

public class NewMeasurement extends DialogFragment 
{ 
    private OnMeasurementSetListener mListener; 

    public static NewMeasurement newInstance(OnMeasurementSetListener listener) 
    { 
     NewMeasurement nm = new NewMeasurement(); 
     Bundle b = new Bundle(); 
     b.putSerializable("listener", listener); // NOT WORKING 
     f.setArguments(b); 
     return f; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     final View v = factory.inflate(R.layout.layout_dialog_new_measurement, null); 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setTitle(R.string.title_alert_dialog_new_weight); 
     builder.setIconAttribute(R.drawable.add); 
     builder.setView(v); 
     builder.setPositiveButton(R.string.alert_dialog_ok, this); 
     builder.setNegativeButton(R.string.alert_dialog_cancel, this); 
     return builder.create(); 

     if (savedInstanceState != null) 
      mListener = (OnMeasurementSetListener) savedInstanceState.getSerializable("listener"); 
    } 
} 
+1

你找到了你的問題的答案? – powder366

回答

2

嗨,你可以嘗試通過設置新的測量來處理這個onAttach方法,它會創建一個回調到你的活動。

public class MeasurementList extends ListFragment implements OnMeasurementSetListener { 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.addMeasurement: 
       NewMeasurement newMeasurementDialog = NewMeasurement.newInstance(this); 
       newMeasurementDialog.show(getFragmentManager(), "newMeasurementDialog"); 
       break; 
      default: 
       break; 
     } 
     return true; 
    } 

    @Override 
    public void onMeasurementSet(Measurement measurement) { 
     MeasurementAdapter listAdapter = (MeasurementAdapter) getListAdapter(); 
     listAdapter.add(measurement); 
    } 
} 

NewMeasurement.java

public class NewMeasurement extends DialogFragment { 

    public interface OnMeasurementSetListener { 
     public abstract void onMeasurementSet(Measurement measurement); 
    } 

    private OnMeasurementSetListener onMeasurementSetListener; 
    private Measurement currentMeasurement; 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      Measurement measurement = new Measurement(); 
      measurement.s = "fragment"; 
      onMeasurementSetListener = (OnMeasurementSetListener) activity; 
      setMeasurement(measurement); 

     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement onMeasurementSetListener"); 
     } 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setTitle("Fragment Dialog"); 
     builder.setIconAttribute(R.drawable.ic_launcher); 
     builder.setPositiveButton(R.string.app_name, new OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       // TODO Auto-generated method stub 

      } 
     }); 
     builder.setNegativeButton(R.string.app_name, new OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       // TODO Auto-generated method stub 

      } 
     }); 
     return builder.create(); 
    } 

    private void setMeasurement(Measurement measurement) { 
     currentMeasurement = measurement; 
     onMeasurementSetListener.onMeasurementSet(measurement); 
    } 

} 

樣品Measurement.java

public class Measurement { 
    public String s; 
} 
+0

感謝您的回答。但是你的解決方案是基於NewMeasurement和Activity之間的通信,而不是MeasurementMessage,它是NewMeasurement對話框的父/調用者。你是否建議NewMeasurement將新創建的度量傳遞給活動,並且活動再次將此傳達給MeasurementList? –

+0

我相信我的問題的答案是片段不應直接與對方通話,而是通過活動。 http://developer.android.com/training/basics/fragments/communicating.html –

0

簡單地說,從你的DialogFragment,你可以叫回活動 THA t包含您的列表片段,調用一個新創建的方法,在活動中更新您的列表片段