android4.4初始化组件有关问题,空指针错误
android4.4初始化组件问题,空指针异常
新建android4.4.2的项目,在res的layout目录下变成fragment_main.xml和activity_main.xml两个文件
在MainActivity中,重写的方法也多了,代码如下:
现在我遇到一个问题,就是我在onCreate的方法下初始化fragment_main.xml文件下的Button组件会报空指针异常
就写在setContentView(R.layout.activity_main);下面。
如果我换一下btn = (Button)findViewById(R.id.btn);的位置,换到super.onCreate(savedInstanceState);前面,就会报:
requestFeature() must be called before adding content的错误。
这是为什么?我初始化组件的位置应该写在哪?求解~~~
------解决方案--------------------
不知道lz问题解决了没有,我没有部署你的代码,我用的是4.4,不用ActionBarActivity了,但我应该知道楼主说的空指针问题所在了
在onCreate方法中你给ActionBarActivity设置的布局文件是activity_main,而按钮不是在这个布局文件中的,所以这里是拿不到的,还有一点你用了Fragment,这个是在Android3增加的,而你的AndroidManifest.xml文件中的:
应该是minSdkVersion = “11”,
找到问题所在,lz可以自己尝试去修改这种实现,在别的地方去获取这个Button,比如说在Fragment中初始化,但是注意调用顺序,不知道lz能否帮助lz解决问题。
------解决方案--------------------
这个是最新的ADT修改的地方,之前的版本默认构建的Android项目的Activity是继承Activity的,也没有搞的这么复杂,这块我还没有更新,没有这么做过,比较快的方法时建议lz用最新版之前一个版本的sdk和adt,或者手动修改Activity,希望对你有帮助~
------解决方案--------------------
这样肯定会报错啊。 因为btn是在fragment_main.xml里面的 ,但你在setContentView(R.layout.activity_main);的下面获取btn,由于activity_main.xml只有一个FrameLayout布局。
所以获取btn的代码要写在
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
下面:
btn = (Button)rootView.findViewById(R.id.btn);
新建android4.4.2的项目,在res的layout目录下变成fragment_main.xml和activity_main.xml两个文件
在MainActivity中,重写的方法也多了,代码如下:
public class MainActivity extends ActionBarActivity {
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
return rootView;
}
}
Button btn = null;
@Override
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();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
现在我遇到一个问题,就是我在onCreate的方法下初始化fragment_main.xml文件下的Button组件会报空指针异常
就写在setContentView(R.layout.activity_main);下面。
btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "点击了按钮", Toast.LENGTH_LONG);
}
});
如果我换一下btn = (Button)findViewById(R.id.btn);的位置,换到super.onCreate(savedInstanceState);前面,就会报:
requestFeature() must be called before adding content的错误。
这是为什么?我初始化组件的位置应该写在哪?求解~~~
------解决方案--------------------
不知道lz问题解决了没有,我没有部署你的代码,我用的是4.4,不用ActionBarActivity了,但我应该知道楼主说的空指针问题所在了
setContentView(R.layout.activity_main);
btn = (Button)findViewById(R.id.btn);
在onCreate方法中你给ActionBarActivity设置的布局文件是activity_main,而按钮不是在这个布局文件中的,所以这里是拿不到的,还有一点你用了Fragment,这个是在Android3增加的,而你的AndroidManifest.xml文件中的:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
应该是minSdkVersion = “11”,
找到问题所在,lz可以自己尝试去修改这种实现,在别的地方去获取这个Button,比如说在Fragment中初始化,但是注意调用顺序,不知道lz能否帮助lz解决问题。
------解决方案--------------------
这个是最新的ADT修改的地方,之前的版本默认构建的Android项目的Activity是继承Activity的,也没有搞的这么复杂,这块我还没有更新,没有这么做过,比较快的方法时建议lz用最新版之前一个版本的sdk和adt,或者手动修改Activity,希望对你有帮助~
------解决方案--------------------
这样肯定会报错啊。 因为btn是在fragment_main.xml里面的 ,但你在setContentView(R.layout.activity_main);的下面获取btn,由于activity_main.xml只有一个FrameLayout布局。
所以获取btn的代码要写在
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
下面:
btn = (Button)rootView.findViewById(R.id.btn);