Есть фрагмент Fragment1
, на него с помощью RecyclerView
выводятся Button
в адаптере это выглядит следующим образом:
@Override
public void onBindViewHolder(final ViewHolder holder,final int position){
final Fragment1 fragment1 = new Fragment1();
final int id = (listItems.get(position).getId());
holder.button.setText(listItems.get(position).getName());
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
fragment1.replaceFragment(id);
break;
default:
break;
}
}
});
}
Метод replaceFragment()
прописан в классе Fragment1
используется для определения нажатой кнопки и замещения Fragment1
на Fragment2
, Fragment3
и т.д. Выглядит это так:
public class Fragment1 extends Fragment{
private RecyclerView recyclerView;
private RecyclerAdapter adapter;
private FragmentTransaction fragmentTransaction;
private List<RecyclerItem> listItems;
private Context context;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.pb_layout,null);
recyclerView = (RecyclerView) v.findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(context));
listItems = new ArrayList<>();
adapter = new RecyclerAdapter(listItems, getActivity());
recyclerView.setAdapter(adapter);
return v;
}
public void replaceFragment(int id){
fragmentTransaction = getFragmentManager().beginTransaction();
switch (id){
case 1:
fragmentTransaction.replace(R.id.containerView, new Fragment2()).commit();
fragmentTransaction.addToBackStack(null);
break;
case 2:
fragmentTransaction.replace(R.id.containerView, new Fragment3()).commit();
fragmentTransaction.addToBackStack(null);
break;
default:
break;
}
}}
Вроде должно работать но выбивает ошибку:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentTransaction android.support.v4.app.FragmentManager.beginTransaction()' on a null object reference
В строке: fragmentTransaction = getFragmentManager().beginTransaction();
Подскажите пожалуйста в чем причина.
Вы создаете фрагмент:
Fragment1 fragment1 = new Fragment1();
После этого в переменной fragment1
хранится ссылка на созданный фрагмент, который еще не привязан ни к какой активити (у этого фрагмента нет хоста в виде активити).
Далее Вы вызываете метод фрагмента:
fragment1.replaceFragment(id);
В котором, в частности, происходит получение FragmentManager
'а:
fragmentTransaction = getFragmentManager().beginTransaction();
Метод getFragmentManager()
класса Fragment
возвращает FragmentManager
активити, которая является хостом для данного фрагмента.
Так как данный фрагмент не связан ни с какой активити, то метод getFragmentManager()
возвращает null
и далее происходит вызов нестатического метода на null
-объекте, в результате чего и генерируется NullPointerException
.
Вообще не очень понятно: если у Вас RecyclerView
находится во фрагменте Fragment1
, то зачем в адаптере Вы создаете новый инстанс Fragment1
? Взаимодействуйте непосредственно с тем фрагментом, в котором находится RecyclerView
.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Здравствуйте уважаемые знатоки)Недавно в процессе изучения Java(путем прохождения javarush) наткнулся на вот такой код, вызвавший у меня когнитивный...
Возможно ли добавить новую запись(нового пользователя) в таблицу, которую извлекли из базы данных? При нажатии кнопки должны открываться...
В tomcat-usersxml задаются пользователи с определенными правами