2015-11-02 61 views
4

我试图让我的片段工作,我不能做任何我想做的事情。Android片段和空对象引用

我正的错误是:

显示java.lang.NullPointerException:尝试上的空对象引用调用虚拟方法“无效android.widget.TextView.setText(java.lang.CharSequence中)”

下面是代码:

public class FragmentOne extends Fragment { 

    private TextView one; 

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

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

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

     // Displaying the user details on the screen 
     one.setText("kjhbguhjg"); 

    } 

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

    } 
} 

不知道为什么,这是行不通的。我正在测试这个类,只是为了看文本将在textview中被改变。我使用正确的ID,因为我检查了10次,但我认为这个问题是因为textview one是一个空对象。但为什么它没有找到该ID?

回答

7

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

+0

试过,之前......在这种情况下,我得到不到的语句错误... – AlwaysConfused

+0

你从无法访问错误的** **编译。请仔细检查语法错误。发布完整的代码。 –

+0

我所有的代码都在问题中,我按照你的建议做了。我将'one =(TextView)getActivity()。findViewById(R.id.one);'放到'return inflater.inflate(R.layout.fragment1,container,false)正下方的onCreateView;' – AlwaysConfused

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; 
} 
+0

谢谢!我会牢记它! – AlwaysConfused

+1

你得到了无法访问的语句错误,导致你在返回语句之后放一个=(TextView)rootView.findViewById(R.id.one),这是该方法的最后一个语句。 – JDRussia