setContentViewとIllegalArgumentExceptionについて

1,163 views
Skip to first unread message

micco

unread,
Nov 3, 2010, 3:06:45 AM11/3/10
to 日本Androidの会
こんにちは。
miccoです。

原因が分からず困っていますので、助言を頂けたらと思います。
アプリケーション起動時に表示するActivity Aから別のActivity Bへ遷移し、再度Aに
戻った際、最新データを読み込み直して、再度setContentView(R.layout.main)を実
行していますが、この際、一定条件下で予期しないエラーで終了してしまいます。

一定条件下というのは、
・開発環境から実機へapkをインストールして立ち上がったアプリを操作したとき
かつ
・初期起動ActivityにおいてsetContentViewで画面を再描画したとき
です。

端末に一旦インストールされたものを起動して操作しても再現しません。
また、初期起動Activity以外のActivityで同じように実装してみましたが、こちらでは
再現しませんでした。
初期起動Activityに戻ったときにsetContentViewを実行しなければ、このエラーは発
生しないことも確認しましたので、setContentViewが原因かと思います。

LogCatを見みると、
IllegalArgumentException occur: parameter must be a descendant of this
view
という例外が発生しています。

「パラメーターはこのビューの子孫でなければならない」・・・どういう警告を受けている
のかピンときていません。setContentViewの引数で渡したレイアウトファイルを疑って
みましたが、特に問題なさそうですし、そもそも最初の表示は問題ないですので。

何かご存知の方がいらっしゃいましたら、情報を頂けたらと思います。
どうぞ宜しくお願いいたします。

micco

unread,
Nov 3, 2010, 4:29:42 AM11/3/10
to 日本Androidの会
miccoです。

もう一つ再現条件がありました。
Activity BにてEditTextで入力してDB保存した後にActivity Aに戻ったときです。
公開中の自作アプリで同じ構造のものがあることに気づいて、同じように開発環境
から端末にapkを転送して、同じような操作をしてみると、やはりエラーを出していま
した。
公開中のアプリでは、一旦インストールされて起動する形なので、特に問題は発生
していないようでした。

awwa

unread,
Nov 3, 2010, 10:35:37 AM11/3/10
to android-g...@googlegroups.com
あわと申します。

どういう実装方法なのかがよくわからないのですが、

> アプリケーション起動時に表示するActivity Aから別のActivity Bへ遷移し、再度Aに
> 戻った際、最新データを読み込み直して、再度setContentView(R.layout.main)を実
> 行していますが


これをやらなければいけない必要性がよくわかりません。
setContentView()はonCreate()で1度だけやっておけばよくて、
再度Aに戻った際はsetContentView()からやり直すのではなく、
onResume()内あたりでデータロードと画面更新処理(例えば、DBからデータをロードしなおして、
Viewに値をセットする、とか)するだけで十分なのではないかなと思います。


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


yokmama

unread,
Nov 3, 2010, 10:43:12 AM11/3/10
to android-g...@googlegroups.com
夜子ままです

まったく原因がわからないのです、状況的な判断からかんがえると。

1 ActivityAをよみこんだとき、データがないのでスキップする。
2 ActivityBでデータを生成する
3 ActivityAはOnCreateで一度生成済みなんだけど、そのときはデータがない不完全な
状態で生成されたので、OnResumeでRestoreしようとしたときに落ちる。

みたいな

IllegalArgumentException occur: parameter must be a descendant of this
view

これはまったく関係ないところでエラーがあるかもしれないですね、よくある問題として
このような別の原因のエラーメッセージに惑わされて本来のエラーの原因を特定できない
ことがあるので。
一度、初期化のロジックを見直したほうがよいとおもいます。


2010年11月3日17:29 micco <gou...@gmail.com>:

micco

unread,
Nov 4, 2010, 11:00:23 AM11/4/10
to 日本Androidの会
こんばんは。
miccoです。

あわさん、夜子ままさん、コメントありがとうございます!

>あわさん
Activity Bでデータの増減が発生し、Activity Aに戻った際にそれを表示する
TextViewを動的に増減するような処理を行っております。
動的に変える部分をLinearLayoutで囲み、その子ビューをremoveViewで削
除してから再度addViewを実行すればエラーは出ません。
しかし、そのレイアウトの下にもButtonView等を配置しており、removeView
で一旦上に詰まって、addViewで挿入されて再度広がるという見た目がイヤ
でしたので、いっそ全て書き直せばということでsetContentVIewを再度呼び
出す形にしました。
おっしゃるようにsetContentViewを再度呼ばない形も検討しておりますが、
そもそも何度もsetContentViewを呼び出すこと自体に問題ないのでしたら、
この方法のまま原因を特定できればと思っておりました。
考え直した方が良さそうですね。

>夜子ままさん
この情報だけでは分からないですよね。
ただ、端末のアイコンをタップして起動した場合には再現しませんが、開発
PCから端末にインストールしてそのまま自動起動されたものを操作した場
合のみ再現しますので、何らかSDK特有のバグでは?という疑いも一方で
持ってました。
同じソースなのに立ち上げ方で発生するというのがどうも腑に落ちなくて。。
もう少しソースと睨めっこしてみます。
> > このグループから退会するには、android-group-j...@googlegroups.com<android-gro-up-japan%2Bunsu...@googlegroups.com>にメールを送信してください。
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

awwa

unread,
Nov 4, 2010, 11:33:14 AM11/4/10
to android-g...@googlegroups.com
miccoさん

あわです。
そういうことでしたか。

> 動的に変える部分をLinearLayoutで囲み、その子ビューをremoveViewで削

このLinearLayoutのlayout_heightをfill_parentにしておいたらどうでしょうか?
removeViewで一旦上に詰まる動作をなくせそうな気がしています。
例えばこんな感じです。
----
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
   android:layout_width="fill_parent" 
   android:layout_height="wrap_content" 
   android:text="@string/hello"
   />
<LinearLayout
android:id="@+id/llayout"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:layout_weight="1" >
<!-- ここにプログラム上でAddViewする -->
</LinearLayout>
<Button
android:text="button"
android:layout_height="wrap_content"
android:layout_width="fill_parent" />
</LinearLayout>
----

ではでは。

2010年11月5日0:00 micco <gou...@gmail.com>:

micco

unread,
Nov 5, 2010, 12:49:39 PM11/5/10
to 日本Androidの会
こんばんは。
miccoです。

あわさん、アドバイスありがとうございます。
layout_heightのfill_parent指定は、あまり使ったことがないので、
ちょっと考えてなかったですね。。。試してみます。
> > <android-gro-up-japan%2Bunsu...@googlegroups.com<android-gro-up-japan%2-52Buns...@googlegroups.com>
Reply all
Reply to author
Forward
0 new messages