2013-07-27 89 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