首页 > 代码库 > android:ActionBarActivity findViewById的返回为NULL

android:ActionBarActivity findViewById的返回为NULL

由于android版本的不断升级,新的版本通常会修改不少api及其他内容。

 

在API=19时,由于MainActivity继承了ActionBarActivity类,舍弃了以前所使用的Activity,

1 public class MainActivity extends Activity    //旧版本的继承关系
 1 public class MainActivity extends ActionBarActivity {     //新版本的继承关系
 2 
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_main);
 7 
 8         if (savedInstanceState == null) {
 9             getSupportFragmentManager().beginTransaction()
10                     .add(R.id.container, new PlaceholderFragment()).commit();
11         }
12     }
................ 13 }

 

同时对资源文件res中的layout文件也重新进行了设计,将一个main.xml改为了现在的两个xml文件:activity.xml和fragment_main.xml

 

因此,如果直接套用老版本的操作在新版本中实现,就会可能产生bug;例如:调用函数findViewById

在老版本中,此函数可以直接在onCreate函数中调用,但是在新版本中则不行,直接调用此函数得到的返回值都会为NULL;

要想调用此函数,需要重载onStart()函数,在onStart()中调用findViewById

 1 @Override
 2     protected void onCreate(Bundle savedInstanceState) {
 3         super.onCreate(savedInstanceState);
 4         setContentView(R.layout.activity_main);
 5 
 6         if (savedInstanceState == null) {
 7             getSupportFragmentManager().beginTransaction()
 8                     .add(R.id.container, new PlaceholderFragment()).commit();
 9         }
10     }
11     
12     protected void onStart(){
13         super.onStart();
14         
15         Button mButton = (Button)this.findViewById(R.id.button1);
16         mButton.setOnClickListener(new OnClickListener(){
17             public void onClick(View v)
18             {
19                 Intent intent = new Intent();
20                 intent.setClass(MainActivity.this, AnotherActivity.class);
21                 startActivity(intent);
22             }
23         });
24     }

 

原因:

   个人分析,很可能是由于将原先的布局文件layout中的main.xml拆分成activity.xml和fragment_main.xml,而导致的;

    因为在onCreate中调用了setContentView(R.layout.activity_main),此函数只是将activity_main.xml设置成了app视图,但是此时程序还没有导入fragment_main.xml;

   以至于只有在onstart周期时,才被允许获取activity_main.xml中的组件资源