Ошибка нулевого указателя при обращении к представлению в макете

1

На самом деле просто, но просто не получается. Я хочу ссылаться на представление по идентификатору, который находится в 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();
    }
  • 0
    от его деятельности - это означает, что из его класса фрагмента или его класса FragmentActivity
  • 0
    В чем ошибка в вашем Logcat? Исключение нулевого указателя? Покажите нам trackfrag.xml
Показать ещё 5 комментариев
Теги:
android-fragments

3 ответа

2
Лучший ответ

Ваша проблема заключается в вызове метода 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);

Пожалуйста, прочитайте документацию об фрагментах и их жизненном цикле.

0

У меня также была эта проблема.

Код, упомянутый выше, просто напишите эту часть в onActivityCreated() в классе Fragment. Таким образом я решил проблему.

  • 0
    каким образом вы получили доступ к инфлятору и группе просмотра из этого метода?
  • 0
    я использую то же утверждение, что и вы, но я получаю к нему доступ с помощью метода getActivity ()
0

вы инициализировали свой надувной элемент таким образом,

     inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

Проверь это. очистите свой проект и запустите...

  • 0
    Инфлятор передается через метод создания представления, поэтому мне не нужно его инициализировать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню