简体   繁体   中英

Passing spinner value from activity to fragment

I have a custom spinner with an ArrayList defined in an activity. On selected item a new fragment is created. Can I pass the value of which fragment was created ("Single Massage" or "Couples Massage") to another fragment within the same activity and then from that fragment pass it to another activity and update its textview? This might not be the best approach, but I am a beginner, so I really don't know that much. Here is my code.

Spinner:

public class MassageActivity extends AppCompatActivity {
private Spinner mSpinner;
private Toolbar mToolbar;
private FragmentManager mFragmentManager;
private FragmentTransaction mFragmentTransaction;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_massage);
    mToolbar = (Toolbar) findViewById(R.id.toolbar_massage);
    setSupportActionBar(mToolbar);
    ActionBar ab = getSupportActionBar();
    if (ab != null) {
        ab.setDisplayHomeAsUpEnabled(true);
    }
    if (ab != null) {
        ab.setDisplayShowTitleEnabled(false);
    }
    customSpinner();

    mFragmentManager = getSupportFragmentManager();
}private void customSpinner() {
    final ArrayList<String> massageType = new ArrayList<>();
    massageType.add("Single Massage");
    massageType.add("Couples Massage");
    massageType.add("Pamper Party");
    mSpinner = (Spinner) findViewById(R.id.spinner);

    CustomSpinnerAdapter spinnerAdapter = new CustomSpinnerAdapter(getApplicationContext(), massageType);
    mSpinner.setAdapter(spinnerAdapter);

    mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if (parent.getItemAtPosition(position).toString()
                    .equals("Pamper Party")) {
                mFragmentTransaction = mFragmentManager.beginTransaction();
                mFragmentTransaction.replace(R.id.fragment_container_massage,
                        new PamperPartyFragment()).commit();
            }
            if (parent.getItemAtPosition(position).toString()
                    .equals("Single Massage")) {
                mFragmentTransaction = mFragmentManager.beginTransaction();
                mFragmentTransaction.replace(R.id.fragment_container_massage,
                        new SingleMassageFragment()).commit();
            }
            if  (parent.getItemAtPosition(position).toString()
                    .equals("Couples Massage")){
                mFragmentTransaction = mFragmentManager.beginTransaction();
                mFragmentTransaction.replace(R.id.fragment_container_massage,
                        new CouplesMassageFragment()).commit();
            }

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

}}

EDIT: I followed the and done this:

String spinnerValue = mSpinner.getSelectedItem().toString();
    Intent i = new Intent(this, SingleMassageFragment.class);
    i.putExtra("spinnerValue", spinnerValue);
    setIntent(i);

And then in my fragment:

MassageActivity activity = (MassageActivity) getActivity();
    Intent f = activity.getIntent();
    String spinnerValue = f.getStringExtra("spinnerValue");
    Utils.doToast(getContext(), spinnerValue);

But whichever fragment I selected, I always get the same toast "Single Massage". Why is that? For any case here's my adapter:

public class CustomSpinnerAdapter extends BaseAdapter {
private Context mContext;
private ArrayList<String> mMassageType;
private LayoutInflater mInflater;
private TextView tvSpinner;

public CustomSpinnerAdapter(Context context, ArrayList<String> massageType) {
    mContext = context;
    mMassageType = massageType;
    mInflater = (LayoutInflater.from(context));
}

@Override
public int getCount() {
    return mMassageType.size();
}

@Override
public Object getItem(int position) {
    return mMassageType.get(position);
}

@Override
public long getItemId(int position) {
    return (long) position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    convertView = mInflater.inflate(R.layout.spinner_layout, null);
    tvSpinner = (TextView) convertView.findViewById(R.id.tvSpinner);
    tvSpinner.setText(mMassageType.get(position));
    return convertView;
}

}

To Pass Data

 PamperPartyFragment mPamperPartyFragment = new PamperPartyFragment();
    Bundle bundle = new Bundle();
    bundle.putInt(key, value);
    mPamperPartyFragment.setArguments(bundle);

 mFragmentTransaction = mFragmentManager.beginTransaction();
                mFragmentTransaction.replace(R.id.fragment_container_massage,
                      mPamperPartyFragment  ).commit();

For Getting data in fragment

Bundle bundle = this.getArguments();
int myInt = bundle.getInt(key, defaultValue);

try This in your spinner setOnItemSelectedListener to send data

    Bundle bundle = new Bundle();
    bundle.putString("spinnerValue",parent.getItemAtPosition(position).toString());
    mPamperPartyFragment.setArguments(bundle);
    mFragmentTransaction = mFragmentManager.beginTransaction();
    mFragmentTransaction.replace(R.id.fragment_container_massage,
            mPamperPartyFragment  ).commit();

to read data in your fragment add this in your onCreate

    Bundle bundle = getArguments();
    String selectedVAlue = bundle.getString("spinnerValue");
in activity :

Intent i = new Intent (this, fragmentname.class);
i.putInt(key, value);
setIntent(i);

in fragment :

ActivityName activity = (ActivityName) getActivity();
Intent f= activity.getIntent();    
int yrid = f.getIntExtra(key);  

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM