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中的组件资源
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。