Reputation: 81
Im trying to pass some data from ListView
using setOnItemClickListener
to Fragment
to another Fragment
using bundle but im getting Null Object Reference
here is the ClickListener
of first Fragment
HomeMakananMieayamFragment.java
ListViewMenuMieAyam.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id ) {
switch (position) {
case 0 :
//set getter to be called based on position
MieAyam mieAyamGeter1 = (MieAyam)ListViewMenuMieAyam.getItemAtPosition(position);
//declare new code
String FoodCode1 = "MA1";
//get MakananName using getter
String FoodName1 = mieAyamGeter1.getmMakananName();
//get MakananPrice using getter
int FoodPrice1 = mieAyamGeter1.getmMakananHarga();
//set the MakananPrice to String to passed to intent
String Price1 = String.valueOf(FoodPrice1);
//Pass the variables
FragmentOrdertoCart fragmentOrdertoCart = new FragmentOrdertoCart();
Bundle bundle1 = new Bundle();
bundle1.putString("FoodCode", FoodCode1);
bundle1.putString("FoodName", FoodName1);
bundle1.putString("FoodPrice", Price1);
fragmentOrdertoCart.setArguments(bundle1);
Fragment FragmentOrdertoCart1 = new FragmentOrdertoCart();
// consider using Java coding conventions (upper first char class names!!!)
FragmentTransaction transaction1 = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction1.replace(R.id.ContainerMieAyam, FragmentOrdertoCart1);
transaction1.addToBackStack(null);
// Commit the transaction
transaction1.commit();
break;
case 1:
MieAyam mieAyamGeter2 = (MieAyam)ListViewMenuMieAyam.getItemAtPosition(position);
String FoodCode2 = "MA2";
String FoodName2 = mieAyamGeter2.getmMakananName();
int FoodPrice2 = mieAyamGeter2.getmMakananHarga();
String Price2 = String.valueOf(FoodPrice2);
FragmentOrdertoCart fragmentOrdertoCart2 = new FragmentOrdertoCart();
Bundle bundle2 = new Bundle();
bundle2.putString("FoodCode", FoodCode2);
bundle2.putString("FoodName", FoodName2);
bundle2.putString("FoodPrice", Price2);
fragmentOrdertoCart2.setArguments(bundle2);
Fragment FragmentOrdertoCart2 = new FragmentOrdertoCart();
// consider using Java coding conventions (upper first char class names!!!)
FragmentTransaction transaction2 = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction2.replace(R.id.ContainerMieAyam, FragmentOrdertoCart2);
transaction2.addToBackStack(null);
// Commit the transaction
transaction2.commit();
break;
case 2:
MieAyam mieAyamGeter3 = (MieAyam)ListViewMenuMieAyam.getItemAtPosition(position);
String FoodCode3 = "MA3";
String FoodName3 = mieAyamGeter3.getmMakananName();
int FoodPrice3 = mieAyamGeter3.getmMakananHarga();
String Price3 = String.valueOf(FoodPrice3);
FragmentOrdertoCart fragmentOrdertoCart3 = new FragmentOrdertoCart();
Bundle bundle3 = new Bundle();
bundle3.putString("FoodCode", FoodCode3);
bundle3.putString("FoodName", FoodName3);
bundle3.putString("FoodPrice", Price3);
fragmentOrdertoCart3.setArguments(bundle3);
Fragment FragmentOrdertoCart3 = new FragmentOrdertoCart();
// consider using Java coding conventions (upper first char class names!!!)
FragmentTransaction transaction3 = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction3.replace(R.id.ContainerMieAyam, FragmentOrdertoCart3);
transaction3.addToBackStack(null);
// Commit the transaction
transaction3.commit();
break;
}
}
});
and this is the second Fragment
FragmentOrdertoCart.java
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.RequiresApi;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toolbar;
/**
* A simple {@link Fragment} subclass.
* Use the {@link FragmentOrdertoCart#newInstance} factory method to
* create an instance of this fragment.
*/
public class FragmentOrdertoCart extends Fragment {
TextView TxtvOrdertoCartCode,TxtvOrdertoCartName,TxtvOrdertoCartPrice;
Toolbar toolbarOrdertoCart;
LinearLayout ContainerContentOrdertoCart;
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
public FragmentOrdertoCart() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment FragmentOrdertoCart.
*/
// TODO: Rename and change types and number of parameters
public static FragmentOrdertoCart newInstance(String param1, String param2) {
FragmentOrdertoCart fragment = new FragmentOrdertoCart();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View viewRoot = inflater.inflate(R.layout.fragment_orderto_cart, container, false);
TxtvOrdertoCartCode = viewRoot.findViewById(R.id.TxtvOrdertoCartCode);
TxtvOrdertoCartName = viewRoot.findViewById(R.id.TxtvOrdertoCartName);
TxtvOrdertoCartPrice = viewRoot.findViewById(R.id.TxtvOrdertoCartPrice);
ContainerContentOrdertoCart = viewRoot.findViewById(R.id.ContainerContentOrdertoCart);
Bundle bundle = this.getArguments();
assert bundle != null;
String Code = bundle.getString("FoodCode");
String Name = bundle.getString("FoodName");
String Price = bundle.getString("FoodPrice");
TxtvOrdertoCartCode.setText(Code);
TxtvOrdertoCartName.setText(Name);
TxtvOrdertoCartPrice.setText(Price);
toolbarOrdertoCart = viewRoot.findViewById(R.id.ToolbarOrdertoCart);
toolbarOrdertoCart.setNavigationIcon(R.drawable.arrowbackicon);
toolbarOrdertoCart.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ContainerContentOrdertoCart.setVisibility(View.GONE);
// Create new fragment and transaction
Fragment FragmentMieAyam = new HomeMakananMieayamFragment();
// consider using Java coding conventions (upper first char class names!!!)
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.COntainerOrdertoCart, FragmentMieAyam);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
}
});
// Inflate the layout for this fragment
return viewRoot;
}
}
Error Log
Process: com.example.pesanpalgading20, PID: 28032
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.BaseBundle.getString(java.lang.String)' on a null object reference
at com.example.pesanpalgading20.FragmentOrdertoCart.onCreateView(FragmentOrdertoCart.java:79)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Upvotes: 0
Views: 426
Reputation: 97
It seems you're practicing it wrong.
Try the following code in each ccase:
Bundle bundle1 = new Bundle();
bundle1.putString("FoodCode", FoodCode1);
bundle1.putString("FoodName", FoodName1);
bundle1.putString("FoodPrice", Price1);
Fragment fragmentOrdertoCart1 = new FragmentOrdertoCart();
fragmentOrdertoCart1.setArguments(bundle1);
FragmentTransaction transaction1 = getFragmentManager().beginTransaction();
transaction1.replace(R.id.ContainerMieAyam, fragmentOrdertoCart1);
transaction1.addToBackStack(null);
transaction1.commit();
Upvotes: 1