addViewでXMLから取得したViewGroupにViewGroupを追加する方法

2,594 views
Skip to first unread message

hirotaka Ohashi

unread,
Mar 8, 2011, 5:06:05 AM3/8/11
to 日本Androidの会
はじめまして。
現在アプリ製作中なのですが、件名の通りXMLからfindViewByIdで取得したビューグループに新しいViewGroupを追加できません。
教えていただけないでしょうか。。お願いします。
したいことは、以下です。
・LinearLayoutにImageView,ProgressBarをViewに持つFrameLayoutを動的に追加したい。

問題のありそうな部分のソースコードを添付します。なお、簡略化のためImageViewやProgressBarの追加の部分は省いてあります。

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout llayout = (LinearLayout)findViewById(R.id.lmain);
FrameLayout framelayout = new FrameLayout (this);
llayout.addView(framelayout);
setContentView(llayout);
}
}

以下、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"
android:background="@color/background"
android:id="@+id/lmain"
>

</LinearLayout>


setContentViewをすると、nullPointerExceptionが返されてしまい、どうしてなのかさっぱりわかりません。。どなた
か、お助けください。。
よろしくお願いします。

S

unread,
Mar 8, 2011, 6:06:01 AM3/8/11
to android-g...@googlegroups.com
清水と申します。

ええと、3行目のfindViewByIdをやった段階ではまたsetContentViewされていないので

ActivityからlmainというViewを見つけ出す行為が失敗してるのではないでしょうか。

それならaddViewが失敗しそうな気がしますが。


問題のありそうな部分のソースコードを添付します。なお、簡略化のためImageViewやProgressBarの追加の部分は省いてあります。

以下、XMLです。

</LinearLayout>

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

hirotaka Ohashi

unread,
Mar 8, 2011, 6:17:07 AM3/8/11
to 日本Androidの会
返答ありがとうございます。
投稿者の大橋です。

ご指摘いただいたことを踏まえ、新しくプロジェクトを作成し、以下のコードを実装してみました。


public class ViewTest extends Activity {
LinearLayout main;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(main);
main = (LinearLayout) findViewById(R.id.l_main);
FrameLayout f_layout = new FrameLayout(this);
f_layout.setBackgroundColor(Color.BLUE);
ViewGroup.LayoutParams layoutparams =
new
ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.FILL_PARENT);
main.addView(f_layout, layoutparams);

}
}

しかし、同じ所でエラーが出てしまいます。どうしたらいいのでしょうか・・

Stone

unread,
Mar 8, 2011, 7:07:00 AM3/8/11
to 日本Androidの会
Stone@調布、東京です

これを↓
setContentView(main);
これに↓
setContentView(R.layout.main);
変えたらもしかしたらうまくいくかも。


On 3月8日, 午後8:17, hirotaka Ohashi <hirone...@gmail.com> wrote:
> 返答ありがとうございます。
> 投稿者の大橋です。
>
> ご指摘いただいたことを踏まえ、新しくプロジェクトを作成し、以下のコードを実装してみました。
>
> public class ViewTest extends Activity {
> LinearLayout main;
> /** Called when the activity is first created. */
> @Override
> public void onCreate(Bundle savedInstanceState) {
> super.onCreate(savedInstanceState);
> setContentView(main);
> main = (LinearLayout) findViewById(R.id.l_main);
> FrameLayout f_layout = new FrameLayout(this);
> f_layout.setBackgroundColor(Color.BLUE);
> ViewGroup.LayoutParams layoutparams =
> new
> ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutP-arams.FILL_PARENT);
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

mochico

unread,
Mar 9, 2011, 2:31:47 AM3/9/11
to 日本Androidの会
一番最初のを変えて

LayoutInflater inflater = (LayoutInflater)
getSystemService(LAYOUT_INFLATER_SERVICE);
LinearLayout main =(LinearLayout) inflater.inflate(R.layout.main,
null);
setContentView(main);

これでいかがでしょう?

S

unread,
Mar 9, 2011, 6:02:33 AM3/9/11
to android-g...@googlegroups.com
最初のレスを書いた清水です。

いや、あれはsetContentViewをfindViewByIdの前にもってくれば動いたはずです。
そう書かなかったのは理由があるのです。
なぜ、ActivityでViewGroup(?)のメンバであるfindViewByIdが実行できるのか、
そういったことを今のうちにちゃんと理解しておいたほうがいいですよ。
ということです。

-----Original Message-----
From: mochico
Sent: Wednesday, March 09, 2011 4:31 PM
To: 日本Androidの会

一番最初のを変えて

これでいかがでしょう?

--

hirotaka Ohashi

unread,
Mar 10, 2011, 9:07:31 PM3/10/11
to 日本Androidの会
みなさんありがとうございました。
Stoneさんのアドバイスを適用したところうまくいきました。

清水さんのおっしゃっているなかで一つ疑問なのですが、
findViewByIdはViewGroupのメンバではなくActivityクラスのメンバ関数のはずです。
もし私の理解不足でしたらご指摘ください。

ひとまず、ありがとうございました。

S

unread,
Mar 12, 2011, 9:33:20 PM3/12/11
to android-g...@googlegroups.com
清水です。

なかなか帰宅できなかったので返信がおくれました。

ViewGroup vg ;
int id = 0 ;
View v = findViewById(id);

というコードはちゃんとコンパイルできます。あとはご自分でどうど。

-----Original Message-----
From: hirotaka Ohashi

S

unread,
Mar 12, 2011, 9:37:36 PM3/12/11
to android-g...@googlegroups.com
清水です。

一部抜けがありました。失礼。

ViewGroup vg = null ;
int id = 0 ;
View v = vg.findViewById(id);

ですね。ただしくは。

Reply all
Reply to author
Forward
0 new messages