2013-07-27 3 views
0

Я создаю приложение, которое имеет 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; 
    } 
} 

Честно говоря, я запутался о документации, которую я читал. Что-то должно произойти в методе newInstanceShiftRowFragment, но я не уверен, что именно. В текущем коде отображаются два значения ShiftRow со значениями по умолчанию (указанными в файле shiftrow_fragment.xml).

И наконец, файл shiftrow_fragment.xml содержит следующие TextViews, которые должны быть динамически заполнены.

  • tvDateIconMonth - Вмещает строковое значение, например, "января", "февраль" и т.д.

  • tvDateIconDay - Имеет значение строки, например, "Mon.", "вт", и т.д.

  • tvExpiration - Имеет значение строки, например, «Сегодня», «Завтра», «в 3-х дней» и т.д.

  • Кроме того, мне нужно установить метку на родителе LinearLayout, который содержит выше TextViews к индексу, чтобы я мог получить доступ к детям Fragment.

Как исправить мой метод addDay(), чтобы сделать то, что мне нужно?

ответ

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)); 
+0

Никогда не передавайте даты. Они не являются потокобезопасными. Вы можете легко передать длинную временную метку и создать объект даты в фрагменте. Если вы хотите передавать даты, используйте объекты Joda DateTime, они намного лучше, чем объекты Date. – Ge3ng

Смежные вопросы