Передача объекта из действия во фрагмент
у меня есть 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 ответов:
создать статический метод в
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");