Доступ к фрагментам как метода, так и содержимого из основной деятельности (все равно нулю)

Попытка реализовать изменение изображения внутри фрагмента, расширяющего класс. После нажатия кнопки в меню из MainActivity с FragmentPagerAdapter приложение всегда вылетает.

Сначала я получил нулевую ошибку от getActivity() во фрагменте, затем заменил их отправкой ImageView при нажатии кнопки основного действия. Это помогло на мгновение, затем мне пришлось переместить объявление массива int из onCreateView(), иначе он снова был пуст, но последним плохим парнем, с которым мне пришлось столкнуться, был super(context).

Согласно Google и тому подобному, что происходит из-за создания активности, происходит после onCreateView(), следовательно, getActivity() и контекстные и общедоступные переменные недоступны. Как его заменить? Где я должен поместить какую-то специальную строку, чтобы получить контекст из фрагмента и получить доступ ко всему внутри?

Вот мой код

//from main activity click
private void loadImage() {
    ImageView v = findViewById(R.id.view_core);
    FragmentHistogram frag = new FragmentHistogram();
    getFragmentManager().executePendingTransactions(); //that str also did not help
    frag.reseter(v);
}

//tried that in fragment but that did not help
@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof Activity){
        a=(Activity) context;
    }
}

=== ОБНОВЛЕНИЕ ===

// in MainActivity
TabAdapter adapter;
Fragment fr;
@Override 
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_tabs);

    ViewPager viewPager = findViewById(R.id.view_pager);
    TabLayout tabLayout = findViewById(R.id.tabs);

    adapter = new TabAdapter(this, getSupportFragmentManager()); //FragmentPagerAdapter 
    viewPager.setAdapter(adapter);
    tabLayout.setupWithViewPager(viewPager);
    fr = adapter.getItem(1); 
} 

 // modified on click also in MainActivity
   private void loadImage() {
    ((FragmentHistogram) fr).reseter(v); //FragmentHistogram fragment class with reseter() method
} 

Но это тоже не работает, контекст снова равен нулю. В onCreate я уже передал контекст this в adapter, следовательно, контекст уже не равен нулю, затем я определяю точный фрагмент из его позиции и получаю метод через приведение. Однако, если даже в этом случае я удаляю v из reseter(), тогда представление не может быть найдено, поскольку его активность не началась.

Еще кое-что я забыл упомянуть. У меня есть внутренний класс внутри класса фрагмента, для которого требуется контекст. Может в этом проблема?

class lHistogram extends View {

    public lHistogram(Context context, Bitmap bi) {            
        super(context);
    }

=== ОБНОВЛЕНИЕ 2 ===

public class TabAdapter extends FragmentPagerAdapter {

final int PAGE_COUNT = 2;
private Context mContext;

public TabAdapter(Context context, FragmentManager fm) {
    super(fm);
    mContext = context;
}

@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            return new FragmentCore();
        default:
            return new FragmentHistogram();
    }
...
}

Я предполагаю, что проблема может быть в порядке создания фрагментов. Я имею в виду, что добавив к строкам журнала onViewCreated, я обнаружил, что независимо от того, какой порядок я установил в Fragment getItem(int position), он всегда отправляет контекст в FragmentCore, что означает, что даже отображение FragmentHistogram в качестве контекста 1-й страницы все еще находится на второй. Что контролирует назначение контекста?

FragmentHistogram frag = new FragmentHistogram(); выдаст вам новый фрагмент, а не текущий.
ADM 08.07.2018 19:47

@ADM Ну, теперь это кажется очевидным, спасибо! Есть идеи, как тогда я могу получить доступ к обоим методам из класса и содержимого класса в целом?

JayJayAbrams 08.07.2018 19:52
stackoverflow.com/questions/9294603/…
ADM 09.07.2018 05:39

Вы добавили фрагмент в свою деятельность? случайная мысль. может быть, полный код поможет

hjchin 10.07.2018 07:07

@hjchin Я обновил сообщение, фрагменты добавлены внутри класса TabAdapter, но теперь я вижу, что проблема определяет, какие элементы управления, как и почему контекст назначается только FragmentCore, и, возможно, после того, как я смог получить от него контекст.

JayJayAbrams 10.07.2018 10:18

Я вижу ... Вы не должны получать фрагмент от адаптера, он всегда возвращает новый фрагмент. U должен иметь возможность получить фрагмент из SupportFragmentManager, как метод developer.android.com/reference/android/support/v4/app/….

hjchin 10.07.2018 11:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решения, выберите 1 или 2; оба работали в моем случае:

  1. https://stackoverflow.com/a/51253168/8859693

Добавьте к каждому FragmentonCreate(), попробуйте вызвать метод setRetainInstance(true);

  1. https://stackoverflow.com/a/51271379/8859693

Добавить расширение класса mcontext=getContext(); для FragmentPagerAdapter

public class TabAdapter extends FragmentPagerAdapter {

final int PAGE_COUNT = 2;
private Context mContext;

public TabAdapter(Context context, FragmentManager fm) {
    super(fm);
    mContext = context;
}

Другие вопросы по теме