【教えてください】コード上で生成したVIewにFragmentを紐付ける方法について

883 views
Skip to first unread message

onigu...@gmail.com

unread,
Aug 28, 2013, 10:53:09 PM8/28/13
to android-g...@googlegroups.com
いつもお世話になっております。

Android初心者で畑違いな発言があるかもしれませんが、ご了承下さい。

早速ですが質問です。
件名のとおり、コード上で生成したViewにFragmentを紐付ける方法が分からず困っております。

●構成としては、次のようなイメージです(APIレベル = 10)。

1、FragmentActivityの定義
2、1のFragmentActivityでFrameLayoutを生成
3、2のFrameLayoutにFragmentを紐付け
4、FragmentActivity上でのFragment表示成功


●コードは次のとおりです。

public class Main extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        FrameLayout    frame = new FrameLayout(this);     // 生成されたFrameLayoutのIDは[-1]でした
 //       frame.setId(1);                                                          // IDを負の値以外にセットするとFragmentの表示が可
        setContentView(frame);
         
        FragmentManager     fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();       

        Fragment_1 fragment = new Fragment_1();
        fragmentTransaction.add(frame.getId(), fragment);
       
        fragmentTransaction.commit();
    }
}

●分かっていること。
fragmentTransaction.addで使用しているcontainerViewIdが負の時はエラーが発生する。
 → そのため、強制的に正の値のIDを割り当てることで、表示ができた。

●解決方法について
・根本的に考え方が間違っている場合は、ご指摘いただければ幸いです。
・コード上でFrameLayoutを生成した時点ではIDが負の値(-1)になっていました。
 → 他のIDと重複しない 且つ 正の値 の条件を満たすIDにセットすることでも解決できるのでは?と考えております。

どうかご教授下さい。

onigu...@gmail.com

unread,
Aug 28, 2013, 10:57:39 PM8/28/13
to android-g...@googlegroups.com
追記です。

●解決方法について
・根本的に考え方が間違っている場合は、
ご指摘いただければ幸いです。
・コード上でFrameLayoutを生成した時点ではIDが負の値(-1)になっていました。
 → 他のIDと重複しない 且つ 正の値 の条件を満たすIDにセットすることでも解決できるのでは?と考えております。
   → ただ上記の条件を満たすIDの設定方法が分かりませんので、こちらご教授いただければ、幸いです。

Hirokazu Fukami

unread,
Aug 28, 2013, 11:02:50 PM8/28/13
to android-g...@googlegroups.com
こんにちはfkmです。

例のようなレイアウトであれば、fkmなら素直にres/layoutに
activity_main.xmlのようなレイアウトファイルを置いて、setContentView()でセットさせますが。。。

で、IDですが、res/valuesに、こんなXMLを置いてあげると、コードからは
R.id.myframe
のようにアクセスできます。(ファイル名はids.xmlなど、なんでもいいようです)

<?xml version="1.0" encoding="utf-8"?>
<resources>
<item type="id" name="myframe" />
</resources>


2013/8/29 <onigu...@gmail.com>:
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com
> にメールを送信します。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
-------------------------------------------------------------
深見 浩和(Hirokazu Fukami)

URI:http://www.fkmsoft.jp
email: f...@fkmsoft.jp

onigu...@gmail.com

unread,
Aug 28, 2013, 11:10:27 PM8/28/13
to android-g...@googlegroups.com
深見様

早速のご返信ありがとうございます。

レイアウトファイルでViewを定義したり、IDを割り当てれることは、知っていたのですが、
興味本位で、レイアウトファイルなしでやってみたいと思っているのです。
(もしかしたら、すごい効率が悪いのかもしれませんが・・・)

なんとか、レイアウトファイルなしで、できないものでしょうか?

厚かましいことを言って、申し訳ありません。

Yom H

unread,
Aug 28, 2013, 11:44:36 PM8/28/13
to android-g...@googlegroups.com
こんな感じでできると思います。

FrameLayout    frame = new FrameLayout(this);
//       frame.setId(1);  // セット不要
setContentView(frame);


Fragment_1 fragment = new Fragment_1();
fragmentTransaction.add(android.R.id.content, fragment);
fragmentTransaction.commit();

android.R.id.content で調べると良いですよ。


2013年8月29日木曜日 12時10分27秒 UTC+9 onigu...@gmail.com:

Makoto Yamazaki

unread,
Aug 28, 2013, 11:53:24 PM8/28/13
to android-g...@googlegroups.com
zaki です。

動的に ID を付けたいのであれば View#generateViewId() というstatic メソッドがあるので、
これを使って生成することができます。

ただし、API 17 以降にしか存在しないので以下のコードを参考に自作するのが良いと思います。

ただ、1つしか生成しないのであれば 0x00FFFFFF 以下の適当な正数を使ってしまう実装でも
困ることはないように思います。 


2013/8/29 <onigu...@gmail.com>

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
YAMAZAKI Makoto

onigu...@gmail.com

unread,
Aug 29, 2013, 2:49:09 AM8/29/13
to android-g...@googlegroups.com

Yom H様

ご返信ありがとうございます。
ご教授いただいた手法で、表示することができました。

android.R.id.content についても自分なりに調べて見ました。
十分な理解はできてはいませんが、FrameLayoutをセットしたcontentそのもののIDを取得しているのかな?
と解釈しました。

引き続き勉学に励みたいと思います。
ありがとうございました。

onigu...@gmail.com

unread,
Aug 29, 2013, 2:54:42 AM8/29/13
to android-g...@googlegroups.com
zaki様

ご返信ありがとうございます。
私のシステムではAPI10でしたので、ご教授いただいた通り、
URLを参照してgenerateViewId()に代わる自作コードを作成致しました。

その結果、求めているID値を取得することができました。

勉強になりました。
ありがとうございました。
Reply all
Reply to author
Forward
0 new messages