問題事例(2): android:nameのパスは絶対か相対か?

このエントリーをはてなブックマークに追加

先日Androidの学習をしていた際に、見事にハマって苦労した箇所があったので、備忘録として掲載しておこうと思います。
引っ掛かったのは、Fragment機能を実装する場合の、android:nameの記述方法でした。
以下、サンプルです。

———-main.xml———-

<LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/LinearLayout1
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="horizontal"
   tools:context=".MainActivity" >

   <fragment
      android:name=".FragmentA"
      android:id="@+id/fragmentA"
      android:layout_width="wrap_content"
      android:layout_height="match_parent"
      android:layout_weight="1" />

   <FrameLayout
      android:name=".FragmentB"
      android:id="@+id/fragmentB"
      android:layout_width="wrap_content"
      android:layout_height="match_parent"
      android:layout_weight="1" />

</LinearLayout>

——————————-

内容は至ってシンプル、画面を二分割して左と右とで別々の内容を表示する、というもの。これの他にMainActivity.java等必要なファイルを揃えてテストしてみると、しかし起動していきなり、エラーで強制終了してしまいました。んんっ?
しばらく悩んでようやく解決してみれば、前述の通りandroid:nameの記述方法に不備があったようです。具体的には、

android:name=”.FragmentA”
android:name=”.FragmentB”

この二箇所。ここは相対表記ではなく、パッケージ名も含めた絶対表記(完全修飾クラス名)で指定しなければいけないみたいです。つまり、

android:name=”jp.co.transsoft.sample.FragmentA”
android:name=”jp.co.transsoft.sample.FragmentB”

こんな具合で書く必要があるみたいです。なるほど、確かに参考書の方は絶対表記で書かれています。
ではなぜ参考書で絶対表記になっているところをわざわざ相対表記で書いたのかという話ですが(笑)、それはManifestファイルでアクティビティコンポーネントを記述する時(<activity>タグを使って書く部分)は、android:nameを相対表記で書いても問題が起こらなかったからです。

———-Manifestファイルのサンプル(一部)———-

<application
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >
   <activity
      android:name=".MainActivity"
      android:label="@string/app_name" >
   </activity>
</application>

———————————————————-

こんな具合で。
なので、Manifestファイルの方でできたんだから、こっちでもできるんじゃないか? とつい思ってしまったわけですね;
ところでこの記事を書くにあたって、もう一度Fragmentのプログラムを実行し直して確認してみたのですが、なぜか相対表記でもAVDで実行できてしまいました。今までできなかったはずなのに、どうして今になって……^^;
しかし実機テストではあいかわらず強制終了だったので、やはり相対表記は使わない方が無難なようです。
なぜManifestファイルで相対表記が可で、こちらでは不可なのか、原因の特定までは至っていないので引き続き調べる必要がありそうですが。
とりあえず、android:nameはパッケージ名込みの絶対表記で指定しておくようにすればハマる確率はグッと減らせそうなので、これからは絶対表記で書いていこう、と思った今日この頃でした。

2013年6月10日 | カテゴリー : Android開発 | 投稿者 : youchin