0

I have problem with passing variable to fragment from my activity. I Have written something like this:

THIS IS PIECE OF MY ACTIVITY CLASS, OnCreate() function

        Bundle bundle = new Bundle();
        bundle.putString("key", "value");
        MembersFragment membersFragment = new MembersFragment();
        membersFragment.setArguments(bundle);

THIS IS PIECE OF MY FRAGMENT CLASS

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            uniCode = getArguments().getString("key");
            textView.setText(uniCode);
        }
    }

And when i want to run my application, TextView is not changed, like arguments are nulls. I have tried so many ways to solve this problem and now i have no idea what is wrong. I think it may be problem with differences beetwen onCreate, onCreateView and onViewCreated, but i give up. Please help me

EDIT1:

To comunicate beetwen activity and fragment i am using something like this:

        tab_layout = findViewById(R.id.tab_layout);
        tab_general = findViewById(R.id.tab_general);
        tab_members = findViewById(R.id.tab_members);
        view_pager = findViewById(R.id.view_pager);
        PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager(),tab_layout.getTabCount());
        view_pager.setAdapter(pagerAdapter);
        tab_layout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                view_pager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

EDIT 3:

my activity class

public class SpecificTeamActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    DrawerLayout drawer_layout_st;
    NavigationView navigationView_st;
    Toolbar toolbar2_st;

    TabLayout tab_layout;
    TabItem tab_general;
    TabItem tab_members;
    ViewPager view_pager;
    String uniCode;


    @SuppressLint("SetTextI18n")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_specific_team);

        tab_layout = findViewById(R.id.tab_layout);
        tab_general = findViewById(R.id.tab_general);
        tab_members = findViewById(R.id.tab_members);
        view_pager = findViewById(R.id.view_pager);
        PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager(),tab_layout.getTabCount());
        view_pager.setAdapter(pagerAdapter);
        tab_layout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                view_pager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

        view_pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                TabLayout.Tab tab = tab_layout.getTabAt(position);
                tab.select();
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        groupTitle = findViewById(R.id.groupTitle);
        uniCode = getIntent().getStringExtra("uniCode");

        groupTitle.setText("Grupa: " + uniCode);


        mDatabase = FirebaseDatabase.getInstance().getReference();
        mAuth = FirebaseAuth.getInstance();
        currentUser = mAuth.getCurrentUser();

        drawer_layout_st = findViewById(R.id.drawer_layout_st);
        navigationView_st = findViewById(R.id.nav_view_st);
        toolbar2_st = findViewById(R.id.toolbar2_st);

        navigationView_st.bringToFront();
        setSupportActionBar(toolbar2_st);
        ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawer_layout_st, toolbar2_st, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer_layout_st.addDrawerListener(actionBarDrawerToggle);
        actionBarDrawerToggle.syncState();
        navigationView_st.setNavigationItemSelectedListener(this);
        navigationView_st.setCheckedItem(R.id.teams);

        Bundle bundle = new Bundle();
        bundle.putString("key", "value");
        MembersFragment membersFragment = new MembersFragment();
        membersFragment.setArguments(bundle);
    }


    @SuppressLint("NonConstantResourceId")
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.teams:
                Intent intent = new Intent(SpecificTeamActivity.this, GroupActivity.class);
                startActivity(intent);
                break;
            case R.id.receipts:
                Intent intent1 = new Intent(SpecificTeamActivity.this, ReceiptActivity.class);
                startActivity(intent1);
                break;
            case R.id.warranty:
                Intent intent2 = new Intent(SpecificTeamActivity.this, WarrantyActivity.class);
                startActivity(intent2);
                break;
            case R.id.stats:
                Intent intent3 = new Intent(SpecificTeamActivity.this, StatsActivity.class);
                startActivity(intent3);
                break;
            case R.id.purch_list:
                Intent intent4 = new Intent(SpecificTeamActivity.this, ShoppingListActivity.class);
                startActivity(intent4);
                break;
            case R.id.logout:
                break;
        }
        drawer_layout_st.closeDrawer(GravityCompat.START);
        return true;
    }

    public String getUniCode(){
        return uniCode;
    }
}

my fragment class code

public class MembersFragment extends Fragment {

    private DatabaseReference mDatabase;
    private FirebaseUser currentUser;
    private FirebaseAuth mAuth;
    private final List<String> membersList = new ArrayList<>();
    private SpecificTeamActivity specificTeamActivity;

    TextView textView;

    ListView listView;

    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    private String uniCode;

    public MembersFragment() {
        // Required empty public constructor
    }

    public static MembersFragment newInstance(String param1, String param2) {
        MembersFragment fragment = new MembersFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        textView = getView().findViewById(R.id.text_view_test);
        textView.setText("test");
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            uniCode = getArguments().getString("key");
            textView.setText(uniCode);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
 

        return inflater.inflate(R.layout.fragment_members, container, false);

    }
}

my adapter class

package com.example.ourmoney;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;

public class PagerAdapter extends FragmentPagerAdapter {

    private int numOfTabs;
    private int selected;

    public PagerAdapter(FragmentManager fm, int numOfTabs) {
        super(fm,numOfTabs);
        this.numOfTabs = numOfTabs;
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {

        switch(position){
            case 0:
                selected = 0;
                return new GeneralFragment();
            case 1:
                selected = 1;
                return new MembersFragment();
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return numOfTabs;
    }

    public int getSelected(){
        return selected;
    }
}
  • Very often in such cases the issue is that someone sets the arguments for an instance of the Fragment which will never be shown on screen... How do you handle navigation between Fragments? Do you use (Support)FragmentManager directly or do you use the navigation framework? – Bö macht Blau Dec 29 '20 at 18:44
  • @BömachtBlau i have edited my question – Piotr Jajo Dec 30 '20 at 14:15
  • Does this answer your question? [How to pass a variable from Activity to Fragment, and pass it back?](https://stackoverflow.com/questions/17436298/how-to-pass-a-variable-from-activity-to-fragment-and-pass-it-back) – Vatsal kesarwani Dec 30 '20 at 14:21
  • @Vatsalkesarwani this solutions doesn't work to me. i don't know where is the problem – Piotr Jajo Dec 30 '20 at 14:41
  • Well, this looks like I'm on the right track. Just to speed things up for you: why don't you post as much code as I need to reproduce the error? We call this a [MCVE]. If this is not (yet) an option for you, please post the code for your implementation of PagerAdapter (there is an [abstract class PagerAdapter](https://developer.android.com/reference/androidx/viewpager/widget/PagerAdapter) but you would not be able to instantiate that, so I suppose you have a local class by the same name) – Bö macht Blau Dec 30 '20 at 15:14
  • @BömachtBlau i have editet my question, thank you for your commitment – Piotr Jajo Dec 30 '20 at 15:26
  • I know there is a lot of unnecessary code here that was created automatically, I'll deal with it later @BömachtBlau – Piotr Jajo Dec 30 '20 at 15:29
  • i solved this problem. i added to adapter's constructor argument, and then i passed it to the fragment's constructor (new consctructor: public MembersFragment(String uniCode){ this.uniCode = uniCode; } and voila. thank you for giving me an idea @BömachtBlau – Piotr Jajo Dec 30 '20 at 16:47
  • All right ... this works because the runtime will not try to create new instances of MembersFragment. Normally a Fragment must have an empty public constructor. But you could have a PagerAdapter method to pass the arguments for MembersFragment into the adapter (I would not use the constructor since the arguments might change) and then in getItem() you can set the correct arguments for MembersFragment (cont) – Bö macht Blau Dec 30 '20 at 17:42
  • (cont) Or you can use a completely different approach and let MembersFragment have a ViewModel. Then you'd update the data in the ViewModel and the Fragment can ask for them as soon as it its up and running. The nice part is that it does not even matter whether you use the Fragment in a ViewPager or standalone. See for example this [guide on sharing data between Activity and Fragment](https://developer.android.com/guide/fragments/communicate) – Bö macht Blau Dec 30 '20 at 17:44

1 Answers1

0
  1. In your activity, you're not actually doing anything to display the fragment you instantiated. Add a fragment transaction to display your fragment. Also make sure the argument bundle key names are actually aligned.

  2. In your fragment, you're trying to set the textView in onCreate() but you only init it in onViewCreated(). That would crash with an NPE. Move the argument reading and textView setting to onViewCreated() too.

laalto
  • 150,114
  • 66
  • 286
  • 303
  • 1. But the problem is, it is working properly unitll i add "getArgument" to my Fragment Class. Without "getArgument" in my class there is everything fine, fragment works ok. No matter where (onCreate, onCreatedView). Keys are correctly aligned. 2. Thanks, i have changed it and TextView is set properly – Piotr Jajo Dec 30 '20 at 15:42
  • did you mean something like this? transaction.replace(R.id.fragment_members,membersFragment); after adding this, the moment I wants to move to the specifyGroupActivity, unfortunately it brings me back to the previous activity – Piotr Jajo Dec 30 '20 at 15:45
  • Likely the fragment you see is ending up on the screen with some code not seen in the question, for example from an inflated activity layout. It has no arguments so the `!= null` check in ´onCreate()` prevents the NPE crash. – laalto Dec 30 '20 at 21:48