IntelliJ IDEA 13新建安卓工程之后打开R文件发现没有内容.

时间:2021-08-07 20:08:57
RT.
升级到IntelliJ IDEA 13之后,新建安卓工程,编译之后一切正常,也能够在虚拟机和真机上运行.但是,在main.xml里面定义了一个Button之后通过findViewById进行查找却没有找到Button导致null指针异常.然后定位到R.java发现这个文件的内容如下:
/*___Generated_by_IDEA___*/

package com.example.Test;

/* This stub is only used by the IDE. It is NOT the R class actually packed into the APK */
public final class R {

}
根本没有看到id.attr什么的定义.
mail.xml文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Hello World, MyActivity"
    android:id="@+id/mButton"
    />
</LinearLayout>

MyActivity.java内容如下:
public class MyActivity extends Activity
{
    private Button mButton;
    /* Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        mButton=(Button)findViewById(R.id.mButton); //此处运行的时候,mButton会是null.
        setContentView(R.layout.main);
    }
}

奇怪的是:
(1)
R.id.mButton是可以的,但是Ctrl+B转到定义的时候却不是跳转到R.id.mButton=xxx那里.而是跳转到main.xml里面的android:id="@+id/mButton".
(2)
即使是这样,编译没有错误,也能在机器上运行.

请高手指点一下为什么?

4 个解决方案

#1


补充一下,如果代码改一下:
mButton=(Button)findViewById(R.id.mButton);
mButton.setOnClickListener(new OnClickListener()
{
  @Override
  public void onClick(View v)
    {
        //do something
    }
});
此时就会因为findViewById并没有找到正确的资源,导致mButton=null,setOnClickListener会引发NullException.

#2


把setContentView放到前面去,这样:

public void onCreate(Bundle savedInstanceState)
{
        super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         mButton=(Button)findViewById(R.id.mButton); 
}

setContentView会把xml资源绑定到Activity上,此后才能直接做find操作,否则一定是空的

#3


引用 2 楼 geniuslt 的回复:
把setContentView放到前面去,这样:

public void onCreate(Bundle savedInstanceState)
{
        super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         mButton=(Button)findViewById(R.id.mButton); 
}

setContentView会把xml资源绑定到Activity上,此后才能直接做find操作,否则一定是空的


感谢指点.NULL的问题解决了,的却是这样.但是,IDEA里边的R文件的内容始终为空是什么情况?如下:
/*___Generated_by_IDEA___*/

package com.example.App;

/* This stub is only used by the IDE. It is NOT the R class actually packed into the APK */
public final class R {
}
在eclipse中,R文件里面会有好几个静态类.比如id,attr什么的.这里虽然没有,但是也不会报错,程序同样运行正常.请指点

#4


我也遇到楼主问题了,一切正常就是R文件是空的

#1


补充一下,如果代码改一下:
mButton=(Button)findViewById(R.id.mButton);
mButton.setOnClickListener(new OnClickListener()
{
  @Override
  public void onClick(View v)
    {
        //do something
    }
});
此时就会因为findViewById并没有找到正确的资源,导致mButton=null,setOnClickListener会引发NullException.

#2


把setContentView放到前面去,这样:

public void onCreate(Bundle savedInstanceState)
{
        super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         mButton=(Button)findViewById(R.id.mButton); 
}

setContentView会把xml资源绑定到Activity上,此后才能直接做find操作,否则一定是空的

#3


引用 2 楼 geniuslt 的回复:
把setContentView放到前面去,这样:

public void onCreate(Bundle savedInstanceState)
{
        super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         mButton=(Button)findViewById(R.id.mButton); 
}

setContentView会把xml资源绑定到Activity上,此后才能直接做find操作,否则一定是空的


感谢指点.NULL的问题解决了,的却是这样.但是,IDEA里边的R文件的内容始终为空是什么情况?如下:
/*___Generated_by_IDEA___*/

package com.example.App;

/* This stub is only used by the IDE. It is NOT the R class actually packed into the APK */
public final class R {
}
在eclipse中,R文件里面会有好几个静态类.比如id,attr什么的.这里虽然没有,但是也不会报错,程序同样运行正常.请指点

#4


我也遇到楼主问题了,一切正常就是R文件是空的