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

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

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

ИЗМЕНИТЬ:

Давайте немного точнее:

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

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

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

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

Спасибо

Ответ 1

Создайте статический метод в 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();

Ответ 2

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

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() для вас в зависимости от того, с чем вы работаете с

Ответ 3

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

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;
}
}

Ответ 4

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

В вашем фрагменте создайте общедоступный метод, подобный этому

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.support.v4.app.Fragment", поэтому я должен использовать "getSupportFragmentManager()". Конечно, этот принцип будет работать также с классом фрагментов, расширяющим "Фрагмент", но тогда вы должны использовать "getFragmentManager()".