Ответ 1
То, что я обычно делаю, и я считаю, что это то, что Google предназначалось для разработчиков, также состоит в том, чтобы по-прежнему получать дополнительные функции из Intent
в Activity
, а затем передавать любые дополнительные данные в фрагменты, создавая их с аргументами.
На самом деле пример в блоге Android dev, который иллюстрирует эту концепцию, и вы увидите это в нескольких примерах API. Хотя этот конкретный пример приведен для фрагментов API 3.0+, тот же поток применяется при использовании FragmentActivity
и Fragment
из библиотеки поддержки.
Сначала вы извлекаете предустановки намерения как обычно в своей деятельности и передаете их как аргументы фрагменту:
public static class DetailsActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// (omitted some other stuff)
if (savedInstanceState == null) {
// During initial setup, plug in the details fragment.
DetailsFragment details = new DetailsFragment();
details.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction().add(
android.R.id.content, details).commit();
}
}
}
Вместо прямого вызова конструктора, возможно, проще использовать статический метод, который подключает аргументы к фрагменту для вас. Такой метод часто называют newInstance
в примерах, предоставленных Google. Фактически есть метод newInstance
в DetailsFragment
, поэтому я не уверен, почему он не используется в фрагменте выше...
В любом случае все дополнительные функции, предоставленные в качестве аргумента при создании фрагмента, будут доступны, вызывая getArguments()
. Поскольку это возвращает a Bundle
, его использование аналогично использованию дополнительных функций в Activity
.
public static class DetailsFragment extends Fragment {
/**
* Create a new instance of DetailsFragment, initialized to
* show the text at 'index'.
*/
public static DetailsFragment newInstance(int index) {
DetailsFragment f = new DetailsFragment();
// Supply index input as an argument.
Bundle args = new Bundle();
args.putInt("index", index);
f.setArguments(args);
return f;
}
public int getShownIndex() {
return getArguments().getInt("index", 0);
}
// (other stuff omitted)
}