Передача объекта из действия во фрагмент


у меня есть Activity использует Fragment. Я просто хочу передать объект из этого Activity до Fragment.

как я мог это сделать? Все учебники, которые я видел до сих пор, где получение данных из ресурсов.

EDIT:

давайте будем немного точнее:

моя деятельность имеет ListView в левой части. Когда вы нажимаете на него, идея состоит в том, чтобы загрузить Fragment в правой части.

когда я вхожу в этот Activity, an Объект Category дается через Intent. Этот объект содержит список других объектов Questions (который содержит список строк). Эти Questions объекты отображаются в ListView. Когда я нажимаю на один элемент из ListView, Я хочу отобразить список String на Fragment (В a ListView).

чтобы сделать это, я называю setContentView() от меня Activity с макетом. В этом макете определяется Fragment С правильным классом назвать. Когда я называю это setContentView(), в onCreateView() моего Fragment, но в это время getArguments() возвращает значение null.

как мне удалось заполнить его до вызова onCreateView() ? (скажите мне, если я не достаточно ясно)

спасибо

6 60

6 ответов:

создать статический метод в Fragment а затем получить его с помощью getArguments().

пример:

public class CommentsFragment extends Fragment {
  private static final String DESCRIBABLE_KEY = "describable_key";
  private Describable mDescribable;

  public static CommentsFragment newInstance(Describable describable) {
    CommentsFragment fragment = new CommentsFragment();
    Bundle bundle = new Bundle();
    bundle.putSerializable(DESCRIBABLE_KEY, describable);
    fragment.setArguments(bundle);

    return fragment;
  }

  @Override
  public View onCreateView(LayoutInflater inflater,
      ViewGroup container, Bundle savedInstanceState) {

    mDescribable = (Describable) getArguments().getSerializable(
        DESCRIBABLE_KEY);

    // The rest of your code
}

вы можете впоследствии вызвать его из Activity делать что-то вроде:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment fragment = CommentsFragment.newInstance(mDescribable);
ft.replace(R.id.comments_fragment, fragment);
ft.commit();

вы должны создать метод внутри вашего фрагмента, который принимает тип объекта, который вы хотите передать в него. В этом случае я назвал его " setObject "(творческий да? :)) Этот метод может затем выполнить любое действие, которое вам нужно с этим объектом.

MyFragment fragment;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

        if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) {
            fragment = new MyFragment();
            getSupportFragmentManager().beginTransaction().add(android.R.id.content, detailsFragment)
                    .commit();
        } else {
           fragment = (MyFragment) getSupportFragmentManager().findFragmentById(
                    android.R.id.content);
        }


        fragment.setObject(yourObject); //create a method like this in your class "MyFragment"
}

обратите внимание, что я использую библиотеку поддержки и вызовы getSupportFragmentManager() может быть просто getFragmentManager () для вас в зависимости от того, что вы работаете с

в вашем классе активности:

public class BasicActivity extends Activity {

private ComplexObject co;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_page);

    co=new ComplexObject();
    getIntent().putExtra("complexObject", co);

    FragmentManager fragmentManager = getFragmentManager();
    Fragment1 f1 = new Fragment1();
    fragmentManager.beginTransaction()
            .replace(R.id.frameLayout, f1).commit();

}

Примечание: ваш объект должен реализовать Serializable интерфейс

тогда в вашем фрагменте:

public class Fragment1 extends Fragment {

ComplexObject co;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    Intent i = getActivity().getIntent();

    co = (ComplexObject) i.getSerializableExtra("complexObject");

    View view = inflater.inflate(R.layout.test_page, container, false);
    TextView textView = (TextView) view.findViewById(R.id.DENEME);
    textView.setText(co.getName());

    return view;
}
}

передача аргументов по пакету ограничена некоторыми типами данных. Но вы можете перенести любые данные в свой фрагмент таким образом:

в вашем фрагменте создать открытый метод, как это

public void passData(Context context, List<LexItem> list, int pos) {
    mContext = context;
    mLexItemList = list;
    mIndex = pos;
}

и в вашей деятельности вызовите passData () со всеми необходимыми типами данных после создания экземпляра фрагмента

        WebViewFragment myFragment = new WebViewFragment();
        myFragment.passData(getApplicationContext(), mLexItemList, index);
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.add(R.id.my_fragment_container, myFragment);
        ft.addToBackStack(null);
        ft.commit();

Примечание: мой фрагмент расширяет " android.поддержка.v4.приложение.Фрагмент", поэтому я должен использовать " getSupportFragmentManager ()". Конечно, это принцип будет работать также с классом фрагмента, расширяющим "фрагмент", но тогда вы должны использовать"getFragmentManager ()".

получить ссылку из следующего примера.

1. Во фрагменте: Создайте ссылочную переменную для класса, объект которого вы хотите во фрагменте. Просто создайте метод setter для ссылочной переменной и вызовите setter перед заменой фрагмента из действия.

 MyEmployee myEmp;
 public void setEmployee(MyEmployee myEmp)
 {
     this.myEmp = myEmp;
 }

2. В действии:

   //we need to pass object myEmp to fragment myFragment

    MyEmployee myEmp = new MyEmployee();

    MyFragment myFragment = new MyFragment();

    myFragment.setEmployee(myEmp);

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.main_layout, myFragment);
    ft.commit();

чтобы передать объект фрагменту, выполните следующие действия:

сначала сохраните объекты в связке, не забудьте поместить в класс сериализуемые реализации.

            CategoryRowFragment fragment = new CategoryRowFragment();

            // pass arguments to fragment
            Bundle bundle = new Bundle();

            // event list we want to populate
            bundle.putSerializable("eventsList", eventsList);

            // the description of the row
            bundle.putSerializable("categoryRow", categoryRow);

            fragment.setArguments(bundle);

затем получить пучки в фрагменте

       // events that will be populated in this row
        mEventsList = (ArrayList<Event>)getArguments().getSerializable("eventsList");

        // description of events to be populated in this row
        mCategoryRow = (CategoryRow)getArguments().getSerializable("categoryRow");