Есть фрагмент 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.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей