Фрагмент NullPointerException, изменение текста фрагмента textView из действия

У меня проблема с моим проектом Android. Я отправляю данные с помощью Datamap на свою одежду. У меня есть прослушиватель данных для получения данных в основной деятельности износа.

В основном я хочу изменить текст textView фрагмента из действия. Когда я пытаюсь это сделать, это не удается, и я получаю --> NullPointerException. Как я могу это исправить?

Это потому, что я вызываю фрагмент в методе onCreate основной активности?

XML-файл основной активности:

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

</android.support.v4.view.ViewPager>

Основная деятельность

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        viewpager = (ViewPager) findViewById(R.id.pager);
        FragmentManager fm = getSupportFragmentManager();
        viewpager.setAdapter(new FragmentAdapter(fm));

        dataListener = new DataApi. DataListener() {
            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void onDataChanged(DataEventBuffer dataEvents) {
                final ArrayList<DataEvent> events = FreezableUtils.freezeIterable(dataEvents);
                DataMap mediaMap;
                DataMap updateMap;
                for (DataEvent event : events) {
                    PutDataMapRequest putDataMapRequest =
                            PutDataMapRequest.createFromDataMapItem(DataMapItem.fromDataItem(event.getDataItem()));

                    if (event.getType() == DataEvent.TYPE_CHANGED) {
                        if (event.getDataItem().getUri().getPath().equals("/myPath")) {
                            dataMap= DataMapItem.fromDataItem(event.getDataItem()).getDataMap();

                            FragmentA fragment = (MainControlScreenFragment) getSupportFragmentManager().findFragmentById(R.id.fragmentA);

}
}

person p3y4m    schedule 16.03.2016    source источник
comment
Пожалуйста, опубликуйте весь MainActivity.class и его xml-файл.   -  person Ivan Ivanov    schedule 16.03.2016
comment
Если я правильно понимаю, вы хотите вызвать метод из вашего MainActivity в MainControlScreenFragment, чтобы установить некоторый текст во фрагменте. Я прав?   -  person Ivan Ivanov    schedule 16.03.2016
comment
Да, ты прав!   -  person p3y4m    schedule 16.03.2016
comment
У меня есть аналогичный вопрос по этой теме, надеюсь, кто-то поможет.   -  person chazefate    schedule 16.03.2016
comment
Если целью DataListener является обновление текста в Fragment, почему бы не поместить его в сам Fragment, а не в Activity? Кажется, что в целом это будет более логическая структура, и в ней не будет необходимости вызывать findFragmentById - что, похоже, и есть ваша проблема (на самом деле вы не указываете, где выбрасывается NPE).   -  person String    schedule 16.03.2016


Ответы (1)


Сделайте реализацию одной тонны в своем фрагменте, добавьте эти строки в MainControlScreenFragment.class выше метода onCreateView():

private static MainControlScreenFragment instance;

public MainControlScreenFragment() {
}

/**
 * Static method which return the instance of the fragment. If the fragment is null, load it,
 * else create new fragment. Singleton pattern.
 *
 * @return
 */
public static MainControlScreenFragment getInstance() {
    if (instance == null) {
        instance = new MainControlScreenFragment();

    }

    return instance;
}

После этого в вашей деятельности вызовите MainControlScreenFragment.getInstance().changeTextMethod(); вместо MainControlScreenFragment fragment = (MainControlScreenFragment) getSupportFragmentManager().findFragmentById(R.id.fragmentA);

Обратите внимание, что ваш changeTextMethod() должен быть объявлен общедоступным в MainControlScreenFragment.class

Надеюсь, это поможет!

person Ivan Ivanov    schedule 16.03.2016