Передача объекта из объекта в фрагмент
У меня есть Activity
, который использует Fragment
. Я просто хочу передать объект из этого Activity
в Fragment
.
Как я мог это сделать?
Все обучающие материалы, которые я видел до сих пор, где извлекаются данные из ресурсов.
ИЗМЕНИТЬ:
Давайте немного точнее:
Моя активность имеет ListView
в левой части. Когда вы нажимаете на нее, идея заключается в загрузке Fragment
в правую часть.
Когда я ввожу этот Activity
, объект Category
задается через Intent
. Этот объект содержит список других объектов Questions
(который содержит список строк). Эти объекты Questions
отображаются в ListView.
Когда я нажимаю на один элемент из ListView
, я хочу отобразить Список String
в Fragment
(в ListView
).
Чтобы сделать это, я вызываю 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()".