Android片段和null对象引用

时间:2015-11-02 01:02:25

标签: java android android-fragments

我试图让我的片段正常工作,但我无法完成任何我想做的事情。

我得到的错误是:

  

java.lang.NullPointerException:尝试调用虚方法' void android.widget.TextView.setText(java.lang.CharSequence)'在空对象引用上

以下是代码:

function registerUser() {
        var username = $("#userName").val();
        $("#userName").val("");
        var password = $("#password1").val();
        $("#password1").val("");
        $("#password2").val("");
        var firstname = $("#firstName").val();
        $("#firstName").val("");
        var secondname = $("#secondName").val();
        $("#secondName").val("");
        var email = $("#email").val();
        $("#email").val("");
        var result = false;

        $.post('../php/register.php', {'username':username, 'password':password, 'email':email, 'firstname':firstname, 'lastname':secondname}, function(data) {
            if(data == 1) {
                result = true; 
            }
            else {
                result = false;
            }
        });
        return result;
    }

不知道它为什么不起作用。我正在测试这个类只是为了查看文本是否会在textview上更改。我正在使用正确的id,因为我检查了10次,但我认为问题是因为textview one是一个null对象。但为什么它没有找到id?

2 个答案:

答案 0 :(得分:12)

onCreate()之前调用

onCreateView(),因此您无法在onCreate()中访问它。

<强>解决方案: 移动

one = (TextView) getActivity().findViewById(R.id.one);

改为onViewCreated()

请参阅下面的图片,了解fragment lifecycle

的概述

新代码段如下所示:

public class FragmentOne extends Fragment {


    private TextView one;

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

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment1, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState){
        one = (TextView) getActivity().findViewById(R.id.one);
        // Displaying the user details on the screen
        one.setText("kjhbguhjg");
    }
}

Fragment lifecycle

答案 1 :(得分:2)

或者。而不是重写

public void onViewCreated(View view, Bundle savedInstanceState)

您可以稍微更改onCreateView,使其看起来像

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment1, container, false)
one = (TextView) rootView.findViewById(R.id.one)
return rootView;
}