2013-07-27 90 views
0

我正在構建一個具有MainActivity extends FragmentActivity的應用程序,該應用程序使用由任意數量的ShiftRowFragment extends Fragment填充的CalendarFragment extends Fragment將片段動態添加到其他片段的方法

我想構建一個方法來動態地將ShiftRowFragment添加到CalendarFragmentShiftRowFragment包含動態值,如日期和時間爲String

這裏是我的CalendarFragment.java

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentTransaction; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class CalendarFragment extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     addDay(); 
     addDay(); 

     View v = inflater.inflate(R.layout.calendar_fragment, container, false); 

     return v; 
    } 

    private void addDay() { 

     ShiftRowFragment shiftFragment = new ShiftRowFragment(); 
     FragmentTransaction transaction = getChildFragmentManager() 
       .beginTransaction(); 
     transaction.add(R.id.llShifts, shiftFragment).commit(); 

    } 
} 

這裏是ShiftRowFragment.java的樣子:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class ShiftRowFragment extends Fragment { 

    public static ShiftRowFragment newInstance(int index) { 
     ShiftRowFragment f = new ShiftRowFragment(); 

     Bundle args = new Bundle(); 
     args.putInt("index", index); 
     f.setArguments(args); 

     return f; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.shiftrow_fragment, container, 
       false); 

     // load calendar 

     return view; 
    } 
} 

坦率地說,我很困惑,我讀過的文檔。 newInstance方法ShiftRowFragment應該發生某些事情,但我不確定究竟是什麼。當前的代碼顯示了兩個帶有默認值的ShiftRow(在shiftrow_fragment.xml文件中指定)。

最後,shiftrow_fragment.xml文件包含以下需要動態填充的TextViews

  • tvDateIconMonth - 保存一個字符串值,如 「一月」, 「二月」 等

  • tvDateIconDay - 保存一個字符串值,如 「星期一」, 「星期二」,等

  • tvExpiration - 保存一個字符串值,如「今天」,「明天」,「3天」等

  • 另外,我需要設置標籤上包含父LinearLayout以上TextViews到某種指數,所以我可以訪問Fragment的孩子。

如何解決我的addDay()方法做什麼,我需要做什麼?

回答

0

addDay()方法應該是這樣的:

private void addDay(String date, String time) { 

    ShiftRowFragment shiftFragment = ShiftRowFragment.newInstance(date, time); 
    FragmentTransaction transaction = getChildFragmentManager() 
      .beginTransaction(); 
    transaction.add(R.id.llShifts, shiftFragment).commit(); 

} 

和你ShiftRowFragment.java應該是這樣的:

public class ShiftRowFragment extends Fragment { 

private static final String BUNDLE_DATE = "DATE"' 
private static final String BUNDLE_TIME = "TIME"' 

    public static ShiftRowFragment newInstance(String date, String time) { 
     ShiftRowFragment f = new ShiftRowFragment(); 

     Bundle args = new Bundle(); 
     args.putString(BUNDLE_DATE, date); 
     args.putString(BUNDLE_TIME, time); 
     f.setArguments(args); 

     return f; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.shiftrow_fragment, container, 
      false); 

     // reference textviews etc. 

     String date; 
     String time; 
     if(savedInstanceState != null) { 
      date = savedInstanceState.getString(BUNDLE_DATE); 
      time = savedInstanceState.getString(BUNDLE_TIME); 
     } 

     tvDateIconMonth.setText(date); 
     // etc. 

     return view; 
    } 
} 

注:我想你應該通過日期和時間,日期不是字符串,因爲你想在片段中做一些日期和時間計算。也許我錯了,但我認爲是這樣,因爲你提到了TextView tvExpiration。如果我是正確的,你會改變StringDate,你會傳遞日期捆綁是這樣的:

i.putLong(BUNDLE_DATE, date.getTime()); 

,你會得到日期片段是這樣的:

Date d = new Date(); 
d.setTime(i.getLong(BUNDLE_DATE, -1)); 
+0

從來沒有過的日期。他們不是線程安全的。您可以輕鬆傳遞較長的時間戳並在片段中創建一個日期對象。如果你想通過日期使用Joda DateTime對象,它們比Date對象好得多。 – Ge3ng