由于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中的组件资源
android:ActionBarActivity findViewById的返回为NULL,布布扣,bubuko.com
时间: 2024-10-06 12:15:09