如何使用bundle从活动接收到片段的值



我正在将值从Activity发送到Fragment。在接收Log cat值时显示Null Pointer Exception .

发送值的代码

 Bundle bundle = new Bundle();
bundle.putString("address",sms.get(position).getmAddress());
bundle.putString("body",sms.get(position).getmBody());
InboxFragment inboxfragment = new InboxFragment();
inboxfragment.setArguments(bundle);
inboxfragment.setArguments(bundle);

接收值的代码

 Bundle bundle= getArguments();
   String address =  bundle.getString("address");
    String body = bundle.getString("body");
    addresstv.setText(address);
    msgtv.setText(body);

日志猫

02-17 12:31:23.363 19118-19118/com.smsfilter E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NullPointerException
at com.smsfilter.InboxFragment.onCreateView(InboxFragment.java:53)
at android.app.Fragment.performCreateView(Fragment.java:1695)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
at android.app.BackStackRecord.run(BackStackRecord.java:682)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)

OnCreateView() 方法的代码

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
   //        return super.onCreateView(inflater, container, savedInstanceState);
    view = inflater.inflate(R.layout.messagebox,container,false);
    lvMsg=(ListView)view.findViewById(R.id.lvMsg);
    checkBox=(CheckBox)view.findViewById(R.id.checkBox);
    TextView addresstv = (TextView) view.findViewById(R.id.lblNumber);
     msgtv = (TextView) view.findViewById(R.id.lblMsg);
    sms= new ArrayList<Message>();
    list = new ArrayList<String>();
    populateMessageList();
     Bundle bundle= getArguments();
    //Bundle bundle= getActivity().getIntent().getExtras();
   String address =  bundle.getString("add");
    String body = bundle.getString("body");
    //addresstv.setText(address);
    msgtv.setText(body);    
     return view;
}

试试这种方式。

    @Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    String address =  getArguments().getString("address");
    String body = getArguments().getString("body");
    addresstv.setText(address);
    msgtv.setText(body);
}

您可以将捆绑数据从活动发送到片段,如下所示

Bundle bundle = new Bundle();
bundle.putString("address", "sms.get(position).getmAddress()");
// set Fragment Arguments
Fragment fragment = new Fragment();
fragment.setArguments(bundle);

您可以像下面这样获取它:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    String address= getArguments().getString("address");   
textview.setText(address); 
    return inflater.inflate(R.layout.fragment, container, false);
}

这应该可以正常工作。谢谢

来自你的活动

在这里你是对的。

Bundle bundle = new Bundle();
bundle.putString("address",sms.get(position).getmAddress());
bundle.putString("body",sms.get(position).getmBody());
InboxFragment inboxfragment = new InboxFragment();
inboxfragment. setArguments (bundle);

片段中,您必须在 onCreate() 中调用 getArguments,其中您将获得 getArguments() null。

所以在片段中尝试

String address, body;
TextView msgtv;
@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container,
                          Bundle savedInstanceState) {
     View view = inflater.inflate(R.layout.layout_filename, this, null);
     msgtv = (TextView) view.findViewById(R.id.your_view_if);
     Bundle bundle= getArguments();
     address =  bundle.getString("address");
     body = bundle.getString("body");
     msgtv.setText(body);
    return view;
}

或者您可以在

public void onActivityCreated (Bundle savedInstanceState) {
     Bundle bundle= getArguments();
     address =  bundle.getString("address");
     body = bundle.getString("body");
     msgtv.setText(body);
}

这肯定会对你有用。

无需传递捆绑包。您可以使用 getActivity().getIntent().getString() 直接检索活动意图。如果不将意向传递给活动,则可以实现一个listener,以便在片段和活动之间进行通信。

你在onCreateView中使用不同的字符串键

改变

 String address =  bundle.getString("add");

String address =  bundle.getString("address");

当您正在为捆绑包添加价值时

bundle.putString("address",sms.get(position).getmAddress());

所以你使用的密钥是 "address" .

因此,当获取您正在使用的值时

String address =  bundle.getString("add");

键不匹配。检索时将密钥"add"更改为如下所示"address"

String address =  bundle.getString("address");

当您在活动中赋予价值时 sms.get(position).getmAddress()方法返回 null。所以 NullPointerException 当你将空值设置为 textview 时。