android.RとただのRの違い

795 views
Skip to first unread message

outerlet

unread,
Oct 4, 2010, 10:53:02 AM10/4/10
to 日本Androidの会
こんばんわ。outerletと申します。
ListViewを使っている時に疑問が生じましたので、どなたかにご教示頂きたく質問させて頂きました。

ListViewに、String配列に格納されている値をセットして表示するプログラムを書きました。
いざ動かしてみると、どうにも腑に落ちないことがあるのです。
以下がそのソースです。

■main.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"
>
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>

■simple_list_item_1.xml
<?xml version="1.0" encoding="UTF-8"?>
<TextView
xmlns:android="http://schema.android.com/apk/res/android"
android:id="@+id/list_row_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

■SampleDataBindingActivity.java(※onCreate以外は省略します)
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

ArrayAdapter<String> adapter = new ArrayAdapter<String>(
this,
android.R.layout.simple_list_item_1, ・・・[1]
new String[]{"Hoge", "Foo", "Bar"});
ListView lv = (ListView)findViewById(android.R.id.list); ・・・[2]
lv.setAdapter(adapter);
}

腑に落ちないのは、JavaソースでのリソースIDの指定方法です。
例えば[1]をR.layout.simple_list.item_1として("android."を無くして)、[2]をR.id.listとする
(同じく"android."を無くす)と実行時エラーが発生します。
ということは[2]はIDの名前空間がandroidになっているから"android."が必要なのかな?と思い、[2]だけ上記ソースの通りにして
も、やはり実行時エラーが発生します。
上記の通り、どちらにも"android."を指定すると期待通り動くのです。

これは何故でしょうか?
[2]には"android."をつけなくてはいけないというのは何となく分かるのですが、layoutディレクトリに入っていて、R.javaにも
static変数が存在する[1]の前にも"android."をつけなくてはいけないというのが分かりません。
そもそもこの"android."はどういう意味を持つのでしょうか?

恐れ入りますが、ご存知の方いらっしゃいましたらご教示頂きたく存じます。
よろしくお願い致します。

yokmama

unread,
Oct 4, 2010, 11:10:35 AM10/4/10
to android-g...@googlegroups.com
夜子ままです





schema -> schemas

の誤りのようです。

2010/10/4 outerlet <freedo...@gmail.com>

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。


outerlet

unread,
Oct 4, 2010, 8:41:16 PM10/4/10
to 日本Androidの会
すみません、イージーミスでしたね…。
お恥ずかしい限りです。
ありがとうございました。

On 10月5日, 午前12:10, yokmama <hijirinhiji...@gmail.com> wrote:
> 夜子ままです
>
> xmlns:android="http://schema.android.com/apk/res/android"
>
> ↓
>
> xmlns:android="http://schemas.android.com/apk/res/android"
>
> schema -> schemas
>
> の誤りのようです。
>
> 2010/10/4 outerlet <freedom.t...@gmail.com>
> > このグループから退会するには、android-group-j...@googlegroups.com<android-group-japan%2Bunsu...@googlegroups.com>にメールを送信してください。
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。

yamada masaki

unread,
Oct 4, 2010, 10:10:53 PM10/4/10
to android-g...@googlegroups.com
android.R.layout.simple_list_item_1 ってのはandroidのシステムが標準で持っているレイアウトです
たぶんファイル名を被らせてしまっているので混同しているんだと思います

むしろ[2]のほうが違和感があります
main.xmlの
android:id="@android:id/list"

android:id="@+id/list"
として
ListView lv = (ListView)findViewById(R.id.list);
で取るべきだと思います

2010/10/5 outerlet <freedo...@gmail.com>:

egg

unread,
Oct 4, 2010, 10:45:07 PM10/4/10
to android-g...@googlegroups.com
yamada masakiさん

江川と申します。

> むしろ[2]のほうが違和感があります

あまり使わないかもしれませんが、ListActivityという名前のActivityの基底クラスがあります。
このクラスはリストをちょっと楽に使えるようにすることを目的としてるのですが
このクラスを使うときは
android:id="@android:id/list"
このIDじゃないとダメです。

------------------------------------------
EGAWA Takashi

2010/10/5 yamada masaki <mas...@hisme.net>:

hkinami

unread,
Oct 5, 2010, 9:20:44 AM10/5/10
to 日本Androidの会
きなみです。

このあたり、つい最近、ちょっと迷いました。
#AndroidのResourceは、かなり強力で便利ですが、単純なタイポではまったりするので、結構大変ですよね、、、

僕が迷ったのは、ListActivityに対して指定するListViewのIDを定義する書き方が複数あるという点です。

1) "@android:id/list"
2) "@id/android:list"
3) "@+id/android:list"

実行してみると、どの書き方でも動くようです。
3)は、意味的にすこしまずい気もしますが、1)と2)は、どちらでもよいようです。

See:
http://developer.android.com/guide/topics/resources/accessing-resources.html#ResourcesFromXml


で、ちょっとしたまとめです。

Androidのリソースは、プログラムから参照できるように、IDがつけられるのですが、リソースのタイプによってどこがIDになるのかが異なるので
注意が必要です。
例えば、res/drawableの下に置いたPNGのファイルなどは、ファイル名から拡張子を除いたものがIDになります。

  res/drawable/icon.png ==> R.drawable.icon (自分のパッケージ名がcom.sample
ならば、com.sample.R.drawable.icon)

また、Androidがシステムとして提供しているDrawbaleならば、そのまま参照できます。

  android.R.drawable.ic_menu_add (追加を表すアイコンの画像)

このように、IDが具体的な実体を指している時は比較的わかりやすいのですが、Layout内に定義するIDは、必ずしもシステムで一意の実体を指して
いない場合があります。
これは、ListActivityの様に、提供側であらかじめ定義したIDを、使う側で定義した要素につける場合などに使われます。

要素にIDをつける場合の記法には、いくつかの書き方があります。

1) "@+id/XXXX"
IDを定義するときの、もっとも一般的な書き方。
  アプリケーションのパッケージ名のRクラスに、XXXXというIDが存在しなければ、ツールによって定数が生成される。

2) "@id/XXXXX"
すでに、別のところで定義したXXXXというIDを参照する。
  IDの定義で使用する場合には、同じIDを別のところで定義することになるので、あまり使用しない。
  ("@drawable/icon”など様に、id以外のリソースを参照する場合には、一般的に使用される記法)

3) "@android:id/XXXXX"
android.R.idで定義しているリソースのIDを使用する。
  この場合のandroidは、パッケージ名なので、別のパッケージ名を書く事もできる。
  例えば、"@com.example:id/XXXXX"など。

4) "@id/android:XXXXX"
3)と同じく、android.R.idで定義しているリソースのIDを使用する。
 この場合の”android”はパッケー名ではなく、andoird.Rを参照するための特別な記法なので、別のパッケージ名を書く事はできない。
   "@+id/android:XXXXX"という書き方をしても実害はないが、新たに定義するという意味になるので、好ましくない(と思う)。

では!
--
Hideo




On 10月5日, 午前11:45, egg <t.eg...@gmail.com> wrote:
> yamada masakiさん
>
> 江川と申します。
>
> > むしろ[2]のほうが違和感があります
>
> あまり使わないかもしれませんが、ListActivityという名前のActivityの基底クラスがあります。
> このクラスはリストをちょっと楽に使えるようにすることを目的としてるのですが
> このクラスを使うときは
> android:id="@android:id/list"
> このIDじゃないとダメです。
>
> ------------------------------------------
> EGAWA Takashi
>
> 2010/10/5 yamada masaki <mas...@hisme.net>:
>
>
>
> > android.R.layout.simple_list_item_1 ってのはandroidのシステムが標準で持っているレイアウトです
> > たぶんファイル名を被らせてしまっているので混同しているんだと思います
>
> > むしろ[2]のほうが違和感があります
> > main.xmlの
> > android:id="@android:id/list"
> > は
> > android:id="@+id/list"
> > として
> > ListView lv = (ListView)findViewById(R.id.list);
> > で取るべきだと思います
>
> > 2010/10/5 outerlet <freedom.t...@gmail.com>:
> >>> > このグループから退会するには、android-group-j...@googlegroups.com<android-gro up-japan%2Bunsu...@googlegroups.com>にメールを送信してください。

yamada masaki

unread,
Oct 5, 2010, 10:01:13 PM10/5/10
to android-g...@googlegroups.com
なるほどListActivityでしたか
自分が過去に作ったソースと比較していたので
こちらはActivityでした

#どこをどう読めばそれに気付くのだろう・・・

2010/10/5 hkinami <hki...@gmail.com>:


> きなみです。
>
> このあたり、つい最近、ちょっと迷いました。
> #AndroidのResourceは、かなり強力で便利ですが、単純なタイポではまったりするので、結構大変ですよね、、、

Reply all
Reply to author
Forward
0 new messages