本帖最后由 u014041041 于 2014-03-25 22:49:00 编辑

解决方案 »

  1.   

    fragment_main.xml的代码:<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.testhello.MainActivity$PlaceholderFragment" >    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" />
        
        <Button 
            android:id="@+id/btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我的按钮" /></RelativeLayout>
    activity_main.xml的代码:<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.example.testhello.MainActivity"
        tools:ignore="MergeRootFrame" />
    MainActivity.java的代码:package com.example.testhello;import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v7.app.ActionBarActivity;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.Toast;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);

    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);
    }

    });

    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);
    }
    }AndroidMainFest.xml的代码:<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.jsonproject"
        android:versionCode="1"
        android:versionName="1.0" >    <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="17" />    <uses-permission android:name="android.permission.INTERNET" >
        </uses-permission>
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
        </uses-permission>    <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.example.jsonproject.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application></manifest>
      

  2.   

    Button  button不用等于null吧....
      

  3.   

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

  4.   

    楼主你定义的两个布局变量混乱了
     
    btn = (Button)findViewById(R.id.btn);你改下button的布局试下
      

  5.   


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

  6.   

    恩~网上查了很多,他们都说这个布局调用的顺序是有问题,不过我不知道怎么解决呢。把初始化Button的代码写在那个静态方法里的话就不会报错,但是事件不会响应了。还在继续调试中
      

  7.   


    大神,一语中的~求指教,我想知道需要了解哪些部分的知识可以让我理解这个调用顺序的问题。问题确实如你所说,我就是不明白配置文件和布局文件以及MainActivity的调用顺序。还有就是怎么样建立项目可以不会继承ActionBarActivity,以前建立项目的时候继承的不是这个类是Activity,也没有两个布局文件。现在有两个是为什么?
    这个是最新的ADT修改的地方,之前的版本默认构建的Android项目的Activity是继承Activity的,也没有搞的这么复杂,这块我还没有更新,没有这么做过,比较快的方法时建议lz用最新版之前一个版本的sdk和adt,或者手动修改Activity,希望对你有帮助~
      

  8.   


    大神,一语中的~求指教,我想知道需要了解哪些部分的知识可以让我理解这个调用顺序的问题。问题确实如你所说,我就是不明白配置文件和布局文件以及MainActivity的调用顺序。还有就是怎么样建立项目可以不会继承ActionBarActivity,以前建立项目的时候继承的不是这个类是Activity,也没有两个布局文件。现在有两个是为什么?
    这个是最新的ADT修改的地方,之前的版本默认构建的Android项目的Activity是继承Activity的,也没有搞的这么复杂,这块我还没有更新,没有这么做过,比较快的方法时建议lz用最新版之前一个版本的sdk和adt,或者手动修改Activity,希望对你有帮助~
    我还想问一下,你知不知道,在
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {}
    这个之后程序还去执行@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();
    }
    }这段代码吗?
    因为组件写在了fragment_main.xml里,所以初始化的时候要写在
    setContentView(R.layout.fragment_main);这个后面,而且这些组件的id都是在
    View rootView = inflater.inflate(R.layout.fragment_main, container,
    false);
    这个rootView里面的
    那我如果我写在setContentView(R.layout.activity_main);
    就是对应"activity_main.xml"里的组件该怎么初始化?
    不知道我这么问你是否能明白?
    话说回来,关于这个帖子,真的非常感谢你给我的启发~~~
      

  9.   

    这样肯定会报错啊。   因为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);不知道lz是否解决了,希望能帮到你。
      

  10.   

    解决了,谢谢~
    不过你能告诉我这个的载入顺序吗?
    fragment_main.xml和activity_main.xml这两个在MainActivity中的载入顺序。
      

  11.   

    组件写在fragment_main.xml里,
    初始化写在public static class PlaceholderFragment extends Fragment { public PlaceholderFragment() {
    }
                    View rootView = inflater.inflate(R.layout.fragment_main, container,
    false);
            Button btn = (Button)rootView.findViewById(R.id.btn);
    TextView tv = (TextView)rootView.findViewById(R.id.tv01);
    }View rootView =.......的后面,看这个例子。findViewById前面要加上这个rootView
      

  12.   

    怎么ADT更新后会变得这么麻烦?这样做有什么好处呢?更新后我创建第一个项目以为那里出错了呢!
      

  13.   

    组件写在fragment_main.xml里,
    初始化写在public static class PlaceholderFragment extends Fragment { public PlaceholderFragment() {
    }
                    View rootView = inflater.inflate(R.layout.fragment_main, container,
    false);
            Button btn = (Button)rootView.findViewById(R.id.btn);
    TextView tv = (TextView)rootView.findViewById(R.id.tv01);
    }View rootView =.......的后面,看这个例子。findViewById前面要加上这个rootView我也是同样的问题,请问楼主是在哪设置按钮监听的。
      

  14.   

    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);
    Button bt_dial = (Button)rootView.findViewById(R.id.bt_dial);
                             bt_dial.setOnClickListener(new MyListener());
    EditText st_number=(EditText)rootView.findViewById(R.id.st_number);
    return rootView;
     
    }

    }findViewById就不报空指针错了
    但是没有办法在别的方法调用定义的EditText st_number=(EditText)rootView.findViewById(R.id.st_number);
      bt_dial.setOnClickListener(new MyListener());也没有办法调用的别的方法不知道难位大侠可以解决此问题,这个问题困扰了我很久了。
      

  15.   

    不知道大神有没解决, 我这里也是遇到同样问题, 写了一个拨号器,但是在手机上一实验就异常退出, 无法执行setOnListener()方法
      

  16.   

    你用Log.i("-->","1"); 
    Log.i("-->","2");这样给每个方法标号,然后程序跑一次就知道那个先载入那个后载入了。
      

  17.   

    在MainActivity类的内部静态类PlaceholderFragment 类中的onCreateView方法中获取fragment_main.xml中控件 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);
    Button btnFirstButton = (Button) rootView.findViewById(R.id.btn_firstButton);
    btnFirstButton.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    Toast.makeText(getActivity(), "rootView.findViewById|fragment_main|getActivity| - -#", Toast.LENGTH_LONG).show();
    }
    });
    return rootView;
    }
    }
      

  18.   

    LZ。我想请问下你。。
      把加载的代码写在public static class PlaceholderFragment extends Fragment这个类里面是如何实现点击按钮页面跳转的。。
    直接用
    Intent intent = new Intent();
    ntent.setClass(this, MainActivity2.class);
    startActivity(intent);
    这种方式是不能跳转的。。
      

  19.   


    在PlaceHolderFragment这个类中创建静态变量EditText st_number,这样可以在MainActivity中其他位置PlaceHolderFragment.st_number这样引用。