在onCreate中调用findViewById时出现NullPointerException

时间:2014-07-15 13:43:54

标签: android android-activity android-fragments android-view findviewbyid

每当我在Activity的onCreate中使用findViewById时,我会得到一个NullPointerException。例如:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
    }
    TextView mTextView = (TextView) findViewById(R.id.textview);
}

我已经读过这个问题可能是因为当我试图找到它们时可能没有完全加载视图,这就是为什么我得到一个空指针。如果我在Activity的片段的onCreateView中调用findViewById,一切正常:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_main, container,
            false);
    TextView mTextView = (TextView) rootView.findViewById(R.id.textview);
}

但是,我需要在这个片段类之外使用mTextView。我在Android的官方文档中看到了许多示例,其中findViewById用于Activity的onCreate。我做错了什么?

2 个答案:

答案 0 :(得分:2)

从布局xmls中,将textview放置在布局xml- activity_main中,以便活动setContentView可以在那里找到它。

目前,textview位于布局xml fragment_main

fyi:fragment_mainactivity_main是两种不同的布局。如果您的应用结构不需要片段,那么您根本不需要它。

答案 1 :(得分:1)

你可以尝试这样的事情 -

class MainActivity extends Activity{
public TextView tv;
protected void onCreate(Bundle savedInstance){
......
}
public void doActionOnTextView()
{
   //at this point you have the textview in tv
   // do what you want to do with it
}
}
class MyFragment extends Fragment{

public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
        false);
TextView mTextView = (TextView) rootView.findViewById(R.id.textview);
mTextView.postRunnable(new Runnable(){
((MainActivity)getActivity()).tv=mTextView;
((MainActivity)getActivity()).doActionOnTextView();

}
}

它不是最好的解决方案,但现在适合你。