【问题标题】:Null Pointer exception on fragment片段上的空指针异常
【发布时间】:2015-12-23 05:55:00
【问题描述】:

我知道这是一个重复的问题,但我无法为我找到正确的问题 我正在尝试将一些数据从我的 OrderMadeFragment 发送到 OrderTakenFragment,但我无法

这是我的课

OrderMadeFragment

import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

/**
 *  on 12/22/2015.
 */
public class OrderMadeFragment extends Fragment
{
    SharedPreferences sh_pref;
    SharedPreferences.Editor toEdit;
    Button b;
    EditText e;
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View rootView = inflater.inflate(R.layout.fragment_order_made, container, false);
        sh_pref=getContext().getSharedPreferences("start", getContext().MODE_PRIVATE);
        toEdit = sh_pref.edit();
        b=(Button)rootView.findViewById(R.id.button);
        e=(EditText)rootView.findViewById(R.id.editText);

        b.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                String qv=e.getText().toString();
                OrderTakenFragment ldf = new OrderTakenFragment();
                Bundle args = new Bundle();
                args.putString("YourKey", qv);
                ldf.setArguments(args);
                Log.e("args", args.toString());

//Inflate the fragment
                getFragmentManager().beginTransaction().add(R.id.container, ldf).commit();
            }
        });
        return rootView;
    }
}

OrderTakenFragment

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Created by on 12/22/2015.
 */
public class OrderTakenFragment extends Fragment
{
    TextView v;
    String bn="abc";
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View rootView = inflater.inflate(R.layout.fragment_order_taken, container, false);
        v=(TextView)rootView.findViewById(R.id.textView);
//        String value = getArguments().getString("YourKey");
       // Log.e("YourKey",value);
        v.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                bn = getArguments().getString("YourKey");
            Toast.makeText(getActivity(),bn,Toast.LENGTH_LONG).show();
            }
        });


        return rootView;
    }
}

Logcat 错误

12-23 11:17:11.811 10669-10669/com.example.qualwebs.test E/args: Bundle[{YourKey=Name}]
12-23 11:17:16.212 10669-10669/com.example.qualwebs.test E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.qualwebs.test, PID: 10669
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
   at com.example.qualwebs.test.OrderTakenFragment$1.onClick(OrderTakenFragment.java:31)
   at android.view.View.performClick(View.java:4785)
   at android.view.View$PerformClick.run(View.java:19884)
   at android.os.Handler.handleCallback(Handler.java:746)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:135)
   at android.app.ActivityThread.main(ActivityThread.java:5343)
   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:907)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:702)

我关注了How to send data from one Fragment to another Fragment?链接

【问题讨论】:

  • Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)'
  • 你能告诉我我做错了什么吗?我知道错误是什么
  • 为什么是getArguments()
  • 测试用例,注释掉bn = getArguments().getString("YourKey");
  • getArguments() == null == true

标签: android android-fragments android-studio


【解决方案1】:

您应该在 OrderTakenFragment 的 onCreate() 中请求参数

 String value;
 @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(getArguments()!=null)
       value = getArguments().getString("YourKey");

 }

然后在你的 onCreateView() 中,在你的 onClick() 下

v.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
          // Use the variable value in your toast
          if(value!=null)
            Toast.makeText(getActivity(),value,Toast.LENGTH_LONG).show();
        }
    });

【讨论】:

  • 在我想要访问数据的片段的另一侧得到空值
  • 您能否确认您没有将 null 作为参数发送 .. 并且您在 OrderTakenFragment 的 onCreate null 参数中收到了 ..?
  • 我正在尝试在公共视图上获取参数 onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
  • 我已经明确提到你需要在你的 onCreate() 函数下得到它。在那里尝试。使用变量在 onCreate 中存储值,然后在 onCreateView() 中使用它。
  • yup 能够在 onCreate() 中获取它,但是当我尝试在 OncreateView 中对其进行 Toast 时,我得到了 null
【解决方案2】:

确保你的 textview v 有:

android:clickable="true"

在您的片段 OrderMadeFragment` 中:

FragmentManager fragmentManager = getActivity().getSupportFragmentManager();

最好还是在你的包含活动中创建一个函数:

public void replaceFragment(Fragment fragment) {
    fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.TheID, fragment);
    fragmentTransaction.commit();
}

然后从片段中使用:

((ContainingActivity) getActivity()).replaceFragment(fragment);

这样您就可以管理您的后台堆栈并控制您的应用导航。

您需要管理您的片段参数。

static final String YOUR_KEY = "YourKey";

private String key_;

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


public static OrderTakenFragment newInstance(String key_) {
    OrderTakenFragment fragment = new OrderTakenFragment();
    Bundle args = new Bundle();
    args.putString(YOUR_KEY, key_);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        key_ = getArguments().getString(YOUR_KEY);
    }
}

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View rootView = inflater.inflate(R.layout.fragment_order_taken, container, false);
    v=(TextView)rootView.findViewById(R.id.textView);
    v.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            if(key_!=null)
            Toast.makeText(getActivity(),key_,Toast.LENGTH_LONG).show();
        }
    });


    return rootView;
}

【讨论】:

【解决方案3】:

你必须从这样的包中的片段中获取数据:

Bundle bundle = this.getArguments();
bn = bundle.getString("YourKey", "abc");

【讨论】:

    【解决方案4】:

    我想写这些帖子作为答案。

    首先,我认为您想在同一活动中将一些 OrderMadeFragment 替换为 OrderTakenFragment

    尝试改变这一行:

    getFragmentManager().beginTransaction().add(R.id.container, ldf).commit();

    到: getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, ldf).commit();

    【讨论】:

      猜你喜欢
      • 2016-09-20
      • 2013-05-14
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多