Java 方法将片段动态添加到另一个片段
我正在构建一个应用程序,它具有Java 方法将片段动态添加到另一个片段,java,android,fragment,Java,Android,Fragment,我正在构建一个应用程序,它具有MainActivity extends FragmentActivity,它使用一个CalendarFragment extends Fragment,由任意数量的ShiftRowFragment extends Fragment填充 我想构建一个方法,将ShiftRowFragment动态添加到CalendarFragment。ShiftRowFragment包含动态值,例如日期和时间,如字符串 这是我的CalendarFragment.java: import
MainActivity extends FragmentActivity
,它使用一个CalendarFragment extends Fragment
,由任意数量的ShiftRowFragment extends Fragment
填充
我想构建一个方法,将ShiftRowFragment
动态添加到CalendarFragment
。ShiftRowFragment
包含动态值,例如日期和时间,如字符串
这是我的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;
}
}
坦率地说,我对我读过的文档感到困惑。在ShiftRowFragment
的newInstance
方法中应该会发生一些事情,但我不确定到底发生了什么。当前代码显示两个具有默认值的ShiftRow(在ShiftRow_fragment.xml文件中指定)
最后,shiftrow_fragment.xml
文件包含以下需要动态填充的textview
-保存字符串值,如“一月”、“二月”等tvDateIconMonth
-保存字符串值,如“Mon.”、“Tue.”等tvDateIconDay
-保存字符串值,如“今天”、“明天”、“三天内”等tvExpiration
- 此外,我需要将包含上述
的父textview
上的标记设置为某种索引,以便访问LinearLayout
片段的子项
addDay()
方法来完成我需要它做的事情?您的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();
}
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;
}
}
您的ShiftRowFragment.java
应该如下所示:
private void addDay(String date, String time) {
ShiftRowFragment shiftFragment = ShiftRowFragment.newInstance(date, time);
FragmentTransaction transaction = getChildFragmentManager()
.beginTransaction();
transaction.add(R.id.llShifts, shiftFragment).commit();
}
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;
}
}
注意:我认为应该将日期和时间作为日期而不是字符串传递,因为您希望在片段中进行一些日期和时间计算。也许我错了,但我想是的,因为你提到了文本视图tvExpiration
。如果我是对的,您将字符串
更改为日期
,并通过以下方式将日期传递到bundle:
i.putLong(BUNDLE_DATE, date.getTime());
Date d = new Date();
d.setTime(i.getLong(BUNDLE_DATE, -1));
您将通过以下方式获得日期:
i.putLong(BUNDLE_DATE, date.getTime());
Date d = new Date();
d.setTime(i.getLong(BUNDLE_DATE, -1));
永远不要错过约会。它们不是线程安全的。您可以轻松地传递长时间戳并在片段中创建日期对象。如果要传递日期,请使用Joda DateTime对象,它们比日期对象要好得多。