Viewから別のViewの非表示について

439 views
Skip to first unread message

teas

unread,
May 29, 2011, 9:10:01 AM5/29/11
to android-g...@googlegroups.com
お世話になります。
ご教示いただきたくトピックを立てさせていただきます。

FrameLayout
 View1
 View2
としている際にView1(SurfaceView)からView2のsetVisibilityがエラーになります。

//Mainの記載内容
     FrameLayout layout = new FrameLayout(this);
     setContentView(layout);

     view.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
     layout.addView(view);

      view2.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
      layout.addView(view2);


//View1の記載内容
Main.view2.setVisibility(Main.view2.GONE);

エラー原因お分かりになられる方はいらっしゃいますか?


awwa

unread,
May 29, 2011, 9:54:54 AM5/29/11
to android-g...@googlegroups.com
あわと申します。

Main.view2.setVisibility(View.GONE);
ですかね?

> としている際にView1(SurfaceView)からView2のsetVisibilityがエラーになります。
の内容を見ればわかると思いますが。

ではでは。

2011年5月29日22:10 teas <ast...@redcave.net>:

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

--
----
awwa <aww...@gmail.com>
Twitter http://twitter.com/awwa500
Blog http://awwa500.blogspot.com/

teas

unread,
May 30, 2011, 4:49:48 AM5/30/11
to android-g...@googlegroups.com
あわ様

ご回答ありがとうございます。
エラーの内容を見てもいまいちわからなかったもので・・・

ご指示いただきました方法を用いてもエラーになりました。
どうやらsurfaceChanged内に書くとエラーにならずrun内に書くとエラーになるようです。
ビューに対しての操作はrun内ではできないものなのでしょうか。


20110530-1.zip

teas

unread,
May 30, 2011, 4:50:41 AM5/30/11
to android-g...@googlegroups.com
添付のファイルのtestSurface2内で処理しています。

awwa

unread,
May 30, 2011, 6:44:29 AM5/30/11
to android-g...@googlegroups.com
teasさん

あわです。

添付されていたソースを実行してみました。
Logcatのエラーは以下です。
「Only the original thread that created a view hierarchy can touch its views.」
つまり「viewを生成したスレッドしかそのviewをいじっちゃダメよ。」って意味です。

そういうときはHandlerを使って元のスレッドにviewの制御をやってもらうように依頼します。
全体的な設計思想からこういう書き方が適切かはわかりませんが、
とりあえず、最低限の修正でただ動けばいいという意味であれば、
以下のように修正すればOKです。
※このままだとあまりかっこ良くないのであくまでもヒント程度に考えてくださいね。

一、testSurface2#run()を以下のように修正します。

public void run() {
while (mainLoop != null) {
now = System.currentTimeMillis();
if(now - now2 > 10000){
now2 = now;
//Main.test.setVisibility(Main.frameLayout.GONE); // modif
handler.sendMessage(handler.obtainMessage(AAA, View.GONE)); // modif
}
Canvas canvas = holder.lockCanvas();
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.FILL);
canvas.drawRect(100, 200, 200, 300, paint);
holder.unlockCanvasAndPost(canvas);
}
}

ニ、testSurface2クラスにHandlerとメッセージ識別子(なんでもいいけどとりあえずAAA)の定義を追加
private static final int AAA = 0;
private Handler handler = new Handler() {
@Override
public void dispatchMessage(Message msg)
{
switch ( msg.what )
{
case AAA:
Main.test.setVisibility(Main.frameLayout.GONE);
break;
}
}
};

と、とりあえず。

2011年5月30日17:50 teas <ast...@redcave.net>:
> 添付のファイルのtestSurface2内で処理しています。

teas

unread,
May 30, 2011, 8:38:50 AM5/30/11
to android-g...@googlegroups.com
あわ様

ご回答ありがとうございます。なるほどぉという感じです。まだまだ勉強不足です;
ほかのスレッドに対しての処理にはHandlerを使用する。理解できました。
ご回答いただきました内容で問題なく実行されました。
ありがとうございました。

Reply all
Reply to author
Forward
0 new messages