android4.4初始化组件有关问题,空指针错误

android4.4初始化组件问题,空指针异常
本帖最后由 u014041041 于 2014-03-25 22:49:00 编辑
新建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解决问题。
------解决方案--------------------
引用:
Quote: 引用:

不知道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解决问题。


大神,一语中的~求指教,我想知道需要了解哪些部分的知识可以让我理解这个调用顺序的问题。问题确实如你所说,我就是不明白配置文件和布局文件以及MainActivity的调用顺序。还有就是怎么样建立项目可以不会继承ActionBarActivity,以前建立项目的时候继承的不是这个类是Activity,也没有两个布局文件。现在有两个是为什么?



这个是最新的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);