Попытка реализовать изменение изображения внутри фрагмента, расширяющего класс. После нажатия кнопки в меню из 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-й страницы все еще находится на второй. Что контролирует назначение контекста?
@ADM Ну, теперь это кажется очевидным, спасибо! Есть идеи, как тогда я могу получить доступ к обоим методам из класса и содержимого класса в целом?
Вы добавили фрагмент в свою деятельность? случайная мысль. может быть, полный код поможет
@hjchin Я обновил сообщение, фрагменты добавлены внутри класса TabAdapter, но теперь я вижу, что проблема определяет, какие элементы управления, как и почему контекст назначается только FragmentCore, и, возможно, после того, как я смог получить от него контекст.
Я вижу ... Вы не должны получать фрагмент от адаптера, он всегда возвращает новый фрагмент. U должен иметь возможность получить фрагмент из SupportFragmentManager, как метод developer.android.com/reference/android/support/v4/app/….




Решения, выберите 1 или 2; оба работали в моем случае:
Добавьте к каждому FragmentonCreate(), попробуйте вызвать метод setRetainInstance(true);
Добавить расширение класса 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;
}
FragmentHistogram frag = new FragmentHistogram();выдаст вам новый фрагмент, а не текущий.