На самом деле просто, но просто не получается. Я хочу ссылаться на представление по идентификатору, который находится в XML файле Fragments
который я раздуваю.
Я объявляю представление.
TextView nameView;
Я получаю представление из макета.
View view = inflater.inflate(R.layout.trackfrag, group, false);
nameView = (TextView)view.findViewById(R.id.trackName);
Я получаю проблему в методе ниже, когда она вызывается из ее активности.
public void setTrackDetails (String name, String description) {
Log.e("TRACKFRAG", "setTrackDetails Called");
nameView.setText(name);
Log.e("TRACKFRAG", "setTrackDetails Finished");
}
Любая помощь приветствуется.
ДОБАВЛЕННЫЙ XML
<TextView
android:id="@+id/trackName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/anchor"
android:text="Track Name"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textSize="22sp" />
Fragment
загружается и отображается отлично, если я не вызываю этот метод, но мне нужно изменить текст в одном из Text Views
.
СОЗДАНИЕ СОЗДАННОЙ ФРАГМЕНТЫ
public void onTrackSelected(String track) {
Log.e("FRAGTRANS","History List Pressed");
Fragment trackFrag = getFragmentManager().findFragmentByTag("historytrack");
if (trackFrag == null) {
trackFrag = new TrackFragment();
Log.e("TRACKSEL","new trackfrag created");
}
addFragment(trackFrag, true, HISTORYTAG, FragmentTransaction.TRANSIT_NONE);
((TrackFragment) trackFrag).setTrackDetails(track,"testing");
}
ДОБАВИТЬ МЕТОД ФРАГМЕНТОВ
void addFragment(Fragment fragment, boolean addToBackStack, String tag, int transition) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(android.R.id.content, fragment);
ft.setTransition(transition);
if (addToBackStack)
ft.addToBackStack(null);
ft.commit();
}
Ваша проблема заключается в вызове метода setTrackDetails(). Посмотрите здесь, где вы можете увидеть:
Вызов commit() не выполняет транзакцию немедленно. Скорее, он планирует запустить его в потоке пользовательского интерфейса активности ("основной" поток), как только поток сможет это сделать.
Итак, сразу после того, как вы вызываете фиксацию, ваш фрагмент еще не создан или создается, и ваше имяView еще не установлено. Лучшее решение было бы после создания вашего фрагмента (может быть после установки nameView, поскольку фрагмент уже имеет активность), вызывая метод из активности, который принимает текст:
View view = inflater.inflate(R.layout.trackfrag, group, false);
nameView = (TextView)view.findViewById(R.id.trackName);
String str = ((MyActivity)getActivity()).getTextForLabel();
nameView.setText(str);
Пожалуйста, прочитайте документацию об фрагментах и их жизненном цикле.
У меня также была эта проблема.
Код, упомянутый выше, просто напишите эту часть в onActivityCreated()
в классе Fragment
. Таким образом я решил проблему.
вы инициализировали свой надувной элемент таким образом,
inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Проверь это. очистите свой проект и запустите...