#android #android-fragments
#Android #android-фрагменты
Вопрос:
Родительская активность:
public class FriendsActivity extends AppCompatActivity implements OnListChanged {
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setOffscreenPageLimit(4);
viewPager.setAdapter(myCustomTabAdapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tablayout);
tabLayout.setupWithViewPager(viewPager);
@Override
public void onListChanged()
{
MyFragment fragment = (FriendsFragment) tabAdapter.getItem(flag-1);
fragment.OnEventEditedAction(5, 5); // called
}
}
MyCustomTabAdapter:
@Override
public Fragment getItem(int position)
{
return MyFragment.NewInstance(position 1);
}
MyFragment:
public class MyFragment extends Fragment implements OnEventEdited{
private OnListChanged onListChanged;
private SwipeRefreshLayout _swipeRefreshLayout;
@Override
public void OnEventEditedAction(int flag, int action)
{
**_swipeRefreshLayout.setRefreshing(true);** // null here
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try
{
onListChanged = (FriendsActivity) context;
}
catch (ClassCastException e)
{
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
// Setting swipeRefresh
_swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipeRefresh);
_swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
}
});
}
У меня есть кнопка в моем фрагменте, затем, когда я нажимаю на кнопку, я вызываю интерфейс следующим образом.
onListChanged.EventListChanged();
Затем событие вызывается в моей родительской активности:
public void onFriendListChanged()
И это событие вызывает событие в моем фрагменте, но это swiperefresh равно нулю
Попытка вызвать виртуальный метод ‘void android.support.v4.widget.SwipeRefreshLayout.setRefreshing(логическое значение)’ для ссылки на нулевой объект
У меня есть вкладка из 4 фрагментов, фрагменты — это тот же «MyFragment», но с другим списком. Когда список в viewpager (3) изменился, мне нужно уведомить viewpager (1) и обновить список.
Ответ №1:
Возможны две проблемы: фрагмент, который я еще не прикрепил к действию при onListChanged()
вызове, или getItem()
метод не возвращает фактический фрагмент, поэтому вам необходимо создать его экземпляр.
Переопределите onAttachFragment()
в своей активности и вызовите оттуда метод интерфейса:
@Override
public void onAttachFragment(Fragment fragment) {
super.onAttachFragment(fragment);
((FriendsFragment) tabAdapter.instantiateItem(viewPager, viewPager.getCurrentItem())).OnEventEditedAction(5, 5);
}
Вместо viewPager.getCurrentItems()
этого вы можете передать нужный вам индекс.
Ответ №2:
В жизненном цикле фрагмента onViewCreated() будет вызываться после onAttach() . Таким образом, есть вероятность, что _swipeRefreshLayout будет нулевым.
Возвращает onListChanged после инициализации _swipeRefreshLayout .
Поместите свой код в следующей последовательности с жизненным циклом фрагмента. Следует соблюдать приведенный ниже порядок. Поместите его в тот же вызов метода жизненного цикла, иначе поместите его в порядок последовательности.
_swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipeRefresh);
_swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
}
});
try
{
onListChanged = (FriendsActivity) context;
}
catch (ClassCastException e)
{
}