0

我正在构建一个应用程序,该应用程序MainActivity extends FragmentActivity使用CalendarFragment extends Fragment由任意数量的ShiftRowFragment extends Fragment.

我想构建一个方法来动态地将 a 添加ShiftRowFragmentCalendarFragment. 包含动态值,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的方法应该会发生一些事情ShiftRowFragment,但我不确定究竟是什么。当前代码显示两个具有默认值的 ShiftRow(在 shiftrow_fragment.xml 文件中指定)。

最后,该shiftrow_fragment.xml文件包含以下TextViews需要动态填充的内容。

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

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

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

  • 另外,我需要将LinearLayout包含上述内容的父级上的标记设置TextViews为某种索引,以便我可以访问Fragment的子级。

我怎样才能修复我的addDay()方法来做我需要做的事情?

4

1 回答 1

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并通过 Date 以这种方式进行捆绑:

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

您将通过这种方式获得片段中的日期:

Date d = new Date();
d.setTime(i.getLong(BUNDLE_DATE, -1));
于 2013-07-28T06:50:22.040 回答