How to pass Arguments to Fragment from Activity

2020-03-24 06:21发布

I have an activity which instantiates and populates a Fragment through a adopter class. I want to pass values/objects to this Fragment adopter class so that i can dictate layout etc.

I have tried passing bundles using the setArgument method but my code bombs out and not sure why. As i understand, i can collect the bundle at the onCreate method in the adopter class. I see the arguments are set correctly immediately after the commented code but alas it crashes after that and i don't understand why. If i remove the bundle code it doesnt crash. :(

Below is my code, does anybody know where i should put the bundle code, commented out?

public class LoginScreen extends ActionBarActivity {
    private final String ARG_SELECTED_LAYOUT_ID = "selectedLayoutId";
private final int DEFAULT_LAYOUT = R.layout.layout_list;

private int mSelectedLayoutId;

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

    ActionBar actionBar = getSupportActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setDisplayShowHomeEnabled(false);

    mSelectedLayoutId = DEFAULT_LAYOUT;
    if (savedInstanceState != null) {
        mSelectedLayoutId = savedInstanceState.getInt(ARG_SELECTED_LAYOUT_ID);
    }

    addLayoutTab(
            actionBar, R.layout.layout_list, R.drawable.ic_list, "list");
    addLayoutTab(
            actionBar, R.layout.layout_grid, R.drawable.ic_grid, "grid");
    addLayoutTab(
            actionBar, R.layout.layout_staggered_grid, R.drawable.ic_staggered, "staggered");
    addLayoutTab(
            actionBar, R.layout.layout_spannable_grid, R.drawable.ic_spannable, "spannable");
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt(ARG_SELECTED_LAYOUT_ID, mSelectedLayoutId);
}

private void addLayoutTab(ActionBar actionBar, int layoutId, int iconId, String tag) {
    ActionBar.Tab tab = actionBar.newTab()
            .setText("")
            .setIcon(iconId)
            .setTabListener(new TabListener(layoutId, tag));
    actionBar.addTab(tab, layoutId == mSelectedLayoutId);
}

public class TabListener implements ActionBar.TabListener {
    private LayoutFragment mFragment;
    private final int mLayoutId;
    private final String mTag;


    public TabListener(int layoutId, String tag) {
        mLayoutId = layoutId;
        mTag = tag;
    }

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
        mFragment = (LayoutFragment) getSupportFragmentManager().findFragmentByTag(mTag);



        if (mFragment == null) {
            mFragment = (LayoutFragment) LayoutFragment.newInstance(mLayoutId);
            ft.add(R.id.content, mFragment, mTag);

        } else {
            ft.attach(mFragment);
        }


        /*
            Bundle bundle = new Bundle();
            bundle.putInt("noTiles", 4);
            mFragment.setArguments(bundle);           
        */

        mSelectedLayoutId = mFragment.getLayoutId();
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            ft.detach(mFragment);
        }
    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
    }
}

}

Logcat

03-03 11:56:53.675  32507-32507/weebuns.predictionking E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: weebuns.predictionking, PID: 32507
    java.lang.RuntimeException: Unable to start activity ComponentInfo{weebuns.predictionking/weebuns.predictionking.LoginScreen}: java.lang.NullPointerException: Attempt to invoke virtual method 'void weebuns.predictionking.LayoutFragment.setArguments(android.os.Bundle)' on a null object reference
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void weebuns.predictionking.LayoutFragment.setArguments(android.os.Bundle)' on a null object reference

5条回答
对你真心纯属浪费
2楼-- · 2020-03-24 07:00

In your activity

Bundle args = new Bundle();
args.putString("Menu", "Your String");
Fragment detail = new FragmeantOne();
detail.setArguments(args);
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, detail).commit();

In your Fragment.. in onCreateView()

String menu = getArguments().getString("Menu");
someTextView.setText(menu);
查看更多
疯言疯语
3楼-- · 2020-03-24 07:01

From Activity you send data with intent as:

  Bundle bundle = new Bundle();
    bundle.putString("edttext", "From Activity");
    // set Fragmentclass Arguments
    Fragmentclass fragobj = new Fragmentclass();
    fragobj.setArguments(bundle);
    ft.add(R.id.content, fragobj, mTag);

and in Fragment onCreateView method:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
}
查看更多
走好不送
4楼-- · 2020-03-24 07:02

To pass argument to your fragment, it's recommended to create a public static method to instanciate your fragment like :

public static MyFragment newInstance(String firstArg) {
        MyFragment f = new MyFragment ();
        Bundle args = new Bundle();
        args.putString("ARG1", firstArg);
        f.setArguments(args);
        return f;
    }

And then retrieve your args in onCreateView() method like :

String arg = getArguments().getString("ARG1");

Use the static method to instanciate a new fragment with your arguments in other fragment or activities like :

MyFragment f = MyFragment.newInstance(myArg);
查看更多
看我几分像从前
5楼-- · 2020-03-24 07:03

It's hard to say without seeing the logcat, but surely you are missing to call the commit() method on the FragmentTransaction. Also remember to set the arguments to the fragment before calling ft.commit().

@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
    mFragment = (LayoutFragment) getSupportFragmentManager().findFragmentByTag(mTag);

    if (mFragment == null) {
        Bundle bundle = new Bundle();
        bundle.putInt("noTiles", 4);
        mFragment = (LayoutFragment) LayoutFragment.newInstance(mLayoutId);
        mFragment.setArguments(bundle);
        //ft.add(R.id.content, mFragment, mTag).commit();
        ft.add(R.id.content, mFragment, mTag);

    } else {
        ft.attach(mFragment);
    }

    mSelectedLayoutId = mFragment.getLayoutId();
}
查看更多
小情绪 Triste *
6楼-- · 2020-03-24 07:19

You can use Bundle to transfer data from activity to fragments or transfre data from fragment to fragment.

Bundle bundle = new Bundle();
DisplayDataList fragment = new DisplayDataList();
bundle.putString("listitem", "Buyer,Seller");
            fragment.setArguments(bundle);

            getFragmentManager().beginTransaction().replace(
                    R.id.frame_container, fragment).addToBackStack(null).commit();

Where you want to recieve that bundle i.w in DisplayDataList Fragment class. You have to use getArguments() method.

DisplayDataList

 Bundle bundle = getArguments();
            String getdata = bundle.getString("listitem");
            System.out.println("Data got-->>> " + getdata);

Hope this will help you.

查看更多
登录 后发表回答