我正在构建一个MainActivity extends FragmentActivity
的应用,该应用使用CalendarFragment extends Fragment
填充的ShiftRowFragment extends Fragment
。
我想构建一个方法来动态地将ShiftRowFragment
添加到CalendarFragment
。 ShiftRowFragment
包含动态值,例如日期和时间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
的{{1}}方法中发生某些事情,但我不确定究竟是什么。当前代码显示两个ShiftRow,其中包含默认值(在shiftrow_fragment.xml文件中指定)。
最后,ShiftRowFragment
文件包含需要动态填充的以下shiftrow_fragment.xml
。
TextViews
- 保存字符串值,例如“Jan.”,“Feb。”等。
tvDateIconMonth
- 保存字符串值,例如“Mon。”,“Tue。”等。
tvDateIconDay
- 保存字符串值,例如“今天”,“明天”,“3天内”等。
此外,我需要将包含上述tvExpiration
的父LinearLayout
的标记设置为某种索引,以便我可以访问TextViews
的子项
如何修复我的Fragment
方法以执行我需要它做的事情?
答案 0 :(得分: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
。如果我是对的,您会将String
更改为Date
,并且您将通过这种方式传递日期:
i.putLong(BUNDLE_DATE, date.getTime());
你将以这种方式获得片段的日期:
Date d = new Date();
d.setTime(i.getLong(BUNDLE_DATE, -1));