将片段动态添加到另一个片段的方法

时间:2013-07-27 21:59:14

标签: java android fragment

我正在构建一个MainActivity extends FragmentActivity的应用,该应用使用CalendarFragment extends Fragment填充的ShiftRowFragment 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的{​​{1}}方法中发生某些事情,但我不确定究竟是什么。当前代码显示两个ShiftRow,其中包含默认值(在shiftrow_fragment.xml文件中指定)。

最后,ShiftRowFragment文件包含需要动态填充的以下shiftrow_fragment.xml

  • TextViews - 保存字符串值,例如“Jan.”,“Feb。”等。

  • tvDateIconMonth - 保存字符串值,例如“Mon。”,“Tue。”等。

  • tvDateIconDay - 保存字符串值,例如“今天”,“明天”,“3天内”等。

  • 此外,我需要将包含上述tvExpiration的父LinearLayout的标记设置为某种索引,以便我可以访问TextViews的子项

如何修复我的Fragment方法以执行我需要它做的事情?

1 个答案:

答案 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));