Подтвердить что ты не робот

Android: Фрагмент не может получить активность

У меня есть операция, которая выполняет транзакцию фрагмента

DetailFragment newFragment = new DetailFragment();
transaction.replace(R.id.mylist, newFragment);
transaction.addToBackStack(null);
transaction.commit();

работает отлично. Теперь я знаю в своей деятельности динамическую строку, которую мне нужно заменить в макете, который у меня есть в newFragment. Я думал, что я могу позвонить после transaction.commit() только что-то вроде

newFragment.setMyString("my dynamic value");

И в newFragment.java у меня есть

public void setMyString(String s)
{
 TextView tv = (TextView) getActivity().findViewById(R.id.myobject);
 tv.setText(s);
}

Дело в том, что getActivity() возвращает null. Как я могу получить контекст, который мне нужен, чтобы найти элементы макета?

Edit:

Я стараюсь следовать по маршруту, используя пучок, поскольку это кажется самым чистым способом. Поэтому я изменил свой код:

Bundle b = new Bundle();
b.putString("text", "my dynamic Text");
DetailFragment newFragment = new DetailFragment();
transaction.replace(R.id.mylist, newFragment);
transaction.addToBackStack(null);
transaction.commit();

Мой фрагмент onCreateView выглядит так:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
   View v = inflater.inflate(R.layout.mylayout, container, false);
   TextView t = (TextView) v.findViewById(R.id.texttobereplaced);
   t.setText(savedInstanceState.getString("text");
}

Кажется, что savedInstranceState пуст. Где я должен найти свой пакет?

Edit2:

пропустил getArguments() в ответе. теперь работает.

4b9b3361

Ответ 1

Ваш Fragment еще не привязан к Activity, что также означает, что ваш макет еще не завышен (см. Жизненный цикл фрагмента). Лучшим решением здесь было бы добавить значение String в качестве аргумента в Fragment с помощью метода Fragment.setArguments(Bundle). Это можно получить в приемнике Fragment с помощью метода Fragment.getArguments().

Ответ 2

Убедитесь, что вы вызываете getActivity() в или после onAttach(), как и раньше, он вернет null.

Ответ 3

Итак, я также использую один и тот же менеджер транзакций фрагментов, и единственная проблема, которую я вижу с вашим кодом, заключается в том, что вы определяете текст TextView внутри вашего метода onCreateView вашего нового класса Fragment, а затем создаете его следующим образом:

public class AboutFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.newFragment, container, false);
        TextView tv = (TextView) v.findViewById(R.id.textview);
        return v;
    }

    public void setMyString(String s) {
        tv.setText(s);
    }
}

Я знаю, что это не имеет особого смысла, но вот как я запускаю свой код, и он отлично работает:)

Ответ 4

Если вам нужно вызвать getActivity в OnCreateView, переместите весь ur-код из onCreateView в onActivityCreate и только левые строки

View v = inflater.inflate(R.layout.xxxx, container, false);
    return v;

в onCreateView

но у меня странная ситуация.

в My onActivityCreated

Spinner s1 = (Spinner) getActivity().findViewById(R.id.bitlength);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
            getActivity(), R.array.bitlengths,
            android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    s1.setAdapter(adapter);

Когда-то действие onActivityCreated не будет работать (правильно!?) и, следовательно, spinner s1 станет пустым.