Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法将片段动态添加到另一个片段_Java_Android_Fragment - Fatal编程技术网

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
    -保存字符串值,如“一月”、“二月”等

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

  • 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对象,它们比日期对象要好得多。