Где/Как getIntent(). GetExtras() в Android Fragment?

С помощью упражнений я использовал это:

В действии 1:

Intent i = new Intent(getApplicationContext(), MyFragmentActivity.class);
                i.putExtra("name", items.get(arg2));
                i.putExtra("category", Category);
                startActivity(i);

В действии 2:

Item = getIntent().getExtras().getString("name");

Как вы это делаете, используя фрагменты? Я также использую библиотеку совместимости v4.

Это происходит в FragmentActivity? Или фактический фрагмент? И какой метод это входит? OnCreate? onCreateView? другой?

И я могу увидеть пример кода, пожалуйста?

EDIT: Стоит отметить, что я пытаюсь сохранить Activity 1 как Activity (или фактически ListActivity, где я передаю намерение listitem при нажатии), а затем перейти к набору фрагментов с вкладками (через Fragment Activity), и мне нужно либо вкладку, чтобы получить дополнительные услуги. (Надеюсь, это возможно?)

Ответ 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)

}

Ответ 2

вы все равно можете использовать

String Item = getIntent().getExtras().getString("name");

в fragment, вам просто нужно сначала вызвать getActivity():

String Item = getActivity().getIntent().getExtras().getString("name");

Это избавит вас от необходимости писать код.