I am having two fragments side by side
in on the MainActivity
LeftFragment
has a RecyclerView
with colors
and I want to set the background color and text on the Right Fragment
when tap on any color on the LeftFragment
The app is crashing with the error null object reference
error.
Here is my Github Repo. However, adding some code for reference.
Left Fragment
public class LeftFragment extends Fragment {
public LeftFragment() {
// Required empty public constructor
}
public static LeftFragment newInstance() {
return new LeftFragment();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_left, container, false);
// private OnColorChooseListener mOnColorChooseListener;
ArrayList<Color> mColor = new ArrayList<>();
mColor.add(new Color(getResources().getColor(R.color.colorRed), getResources().getString(R.string.red)));
mColor.add(new Color(getResources().getColor(R.color.colorOrange), getResources().getString(R.string.orange)));
mColor.add(new Color(getResources().getColor(R.color.colorYellow), getResources().getString(R.string.yellow)));
mColor.add(new Color(getResources().getColor(R.color.colorLime), getResources().getString(R.string.lime)));
mColor.add(new Color(getResources().getColor(R.color.colorGreen), getResources().getString(R.string.green)));
mColor.add(new Color(getResources().getColor(R.color.colorCyan), getResources().getString(R.string.cyan)));
mColor.add(new Color(getResources().getColor(R.color.colorBlue), getResources().getString(R.string.blue)));
mColor.add(new Color(getResources().getColor(R.color.colorIndigo), getResources().getString(R.string.indigo)));
mColor.add(new Color(getResources().getColor(R.color.colorViolet), getResources().getString(R.string.violet)));
RecyclerView mRecyclerView = view.findViewById(R.id.color_list_view);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
RecyclerView.Adapter mAdapter = new ColorAdapter(mColor, getActivity());
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
return view;
}
}
Right Fragment
public class RightFragment extends Fragment {
ColorAdapter colorAdapter;
ArrayList<Color> color;
public RightFragment() {
// Required empty public constructor
}
public static RightFragment newInstance() {
return new RightFragment();
}
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState
) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_right, container, false);
final ConstraintLayout constraintLayout = view.findViewById(R.id.right_color_block);
final TextView textView = view.findViewById(R.id.right_color_text);
colorAdapter.SetItemClickListener(new ColorAdapter.OnItemClickListener() {
@Override
public void OnItemClick(int position) {
constraintLayout.setBackgroundColor(color.get(position).getmColor());
textView.setText(color.get(position).getmLabel());
}
});
return view;
}
}
ColorAdaptor (RecyclerView)
public class ColorAdapter extends RecyclerView.Adapter<ColorAdapter.ColorViewHolder> {
private List<Color> mColor;
private Context mContext;
private OnItemClickListener mOnItemClickListener;
public ColorAdapter(List<Color> mColor, Context mContext) {
this.mColor = mColor;
this.mContext = mContext;
}
public void SetItemClickListener(OnItemClickListener listener) {
this.mOnItemClickListener = listener;
}
@NonNull
@Override
public ColorViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.color_list_item, viewGroup, false);
return new ColorViewHolder(view, mOnItemClickListener);
}
@Override
public void onBindViewHolder(@NonNull final ColorViewHolder colorViewHolder, final int i) {
final Color color = mColor.get(i);
colorViewHolder.itemColorText.setText(color.getmLabel());
colorViewHolder.itemColorText.setBackgroundColor(color.getmColor());
colorViewHolder.itemColorText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "Item clicked: " + i, Toast.LENGTH_SHORT).show();
// colorViewHolder.feedbackBlock.setBackgroundColor(color.getmColor());
colorViewHolder.feedbackText.setText(color.getmLabel());
}
});
}
@Override
public int getItemCount() {
return mColor.size();
}
public interface OnItemClickListener {
void OnItemClick(int position);
}
class ColorViewHolder extends RecyclerView.ViewHolder {
public ConstraintLayout itemColorBlock;
public TextView itemColorText;
public ConstraintLayout feedbackBlock;
public TextView feedbackText;
public ColorViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
super(itemView);
itemColorBlock = itemView.findViewById(R.id.color_block);
itemColorText = itemView.findViewById(R.id.color_text);
feedbackBlock = itemView.findViewById(R.id.right_color_block);
feedbackText = itemView.findViewById(R.id.right_color_text);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener != null) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
listener.OnItemClick(position);
}
}
}
});
}
}
}
Color
public class Color {
private int mColor;
private String mLabel;
public Color(@ColorInt int color, String label) {
this.mColor = color;
this.mLabel = label;
}
public String getmLabel() {
return mLabel;
}
public void setmLabel(String mLabel) {
this.mLabel = mLabel;
}
public int getmColor() {
return mColor;
}
public void setmColor(@ColorInt int mColor) {
this.mColor = mColor;
}
@NonNull
@Override
public String toString() {
return super.toString();
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LeftFragment leftFragment = LeftFragment.newInstance();
getSupportFragmentManager().beginTransaction().replace(R.id.left_container, leftFragment).commit();
RightFragment rightFragment = RightFragment.newInstance();
getSupportFragmentManager().beginTransaction().replace(R.id.right_container, rightFragment).commit();
}
}