Search code examples
javaandroidandroid-fragmentactivity

Cant send data from activity to fragment with bundle


I have a tab layout and i want to send my id into my fragment. I have tried using Bundle but it doesn't work. It seems I have misplaced the code. This is the code.

My Activity

public class DetailPegawai extends AppCompatActivity {
private ViewPager mViewPager;
private SectionsPagerAdapter mSectionsPageAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detail_pegawai);
    getSupportActionBar().hide();

    mSectionsPageAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    mViewPager = (ViewPager) findViewById(R.id.container);
    setupViewPager(mViewPager);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(mViewPager);
}

private void setupViewPager(ViewPager viewPager) {
    String id = getIntent().getStringExtra("id");
    SectionsPagerAdapter adapter = new SectionsPagerAdapter(getSupportFragmentManager());
    
    Bundle bundle = new Bundle();
    bundle.putString("id", id);
    Tab_1_Workplace fragobj = new Tab_1_Workplace();
    fragobj.setArguments(bundle);
    
    adapter.addFragment(new Tab_1_Workplace(), "WORKPLACE");
    adapter.addFragment(new Tab_2_PersonalInfo(), "INFO");
    viewPager.setAdapter(adapter);
}

My Fragment

public class Tab_1_Workplace extends Fragment{
String id;
View rootView;

public Tab_1_Workplace() {

}

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

    rootView=inflater.inflate(R.layout.tab_1_workplace, container, false);
    
    bundle = this.getArguments();
    id = bundle.getString("id");
    
    return rootView;
}

Section Pager Adapter

public class SectionsPagerAdapter extends FragmentPagerAdapter {

private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();

public void addFragment(Fragment fragment, String title) {
    mFragmentList.add(fragment);
    mFragmentTitleList.add(title);
}

public SectionsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public CharSequence getPageTitle(int position) {
    return mFragmentTitleList.get(position);
}

@Override
public Fragment getItem(int position) {
    return mFragmentList.get(position);
}

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

Logcat Error

java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference


Solution

  • You have set the Bundle. but the problem is you never send it. you must call your fragment with your bundle, not your default Fragment.

    adapter.addFragment(fragobj, "WORKPLACE");
    

    So your code must be like this

    public class DetailPegawai extends AppCompatActivity {
    private ViewPager mViewPager;
    private SectionsPagerAdapter mSectionsPageAdapter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail_pegawai);
        getSupportActionBar().hide();
    
        mSectionsPageAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
    
        mViewPager = (ViewPager) findViewById(R.id.container);
        setupViewPager(mViewPager);
    
        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(mViewPager);
    }
    
    private void setupViewPager(ViewPager viewPager) {
        String id = getIntent().getStringExtra("id");
        SectionsPagerAdapter adapter = new SectionsPagerAdapter(getSupportFragmentManager());
    
        Bundle bundle = new Bundle();
        bundle.putString("id", id);
        Tab_1_Workplace fragobj = new Tab_1_Workplace();
        fragobj.setArguments(bundle);
    
        adapter.addFragment(fragobj, "WORKPLACE");
        adapter.addFragment(new Tab_2_PersonalInfo(), "INFO");
        viewPager.setAdapter(adapter);
    }