ScrollViewに対してsetLayoutParams()が機能しない。

閲覧: 2,370 回
最初の未読メッセージにスキップ

まち

未読、
2010/10/07 8:15:362010/10/07
To: 日本Androidの会
こんにちは。まちと申します。

現在、Activity上の一部領域をScrollViewとして確保し、
何らかのイベントに応じてScrollViewの子Viewの要素が追加されていくことで
スクロール可能な領域が伸びていくウィンドウを作ろうとしています。
(最終的には、ScrollViewを継承したカスタムクラスとして用意し、
 追加された子View要素の位置まで自動スクロールさせたり、
 このウィンドウを、ひとつのActivity上で、背景や他の要素と
 同時に並べることができるようにしたいと考えています。
 複数人数でのチャットを表示するウィンドウをイメージしています)

この際、ScrollViewのサイズが画面全体にならないよう、
setLayoutParams()でビューのサイズを設定してやろうとしたのですが、
ViewGroupを継承した他のクラスと違い、なぜかScrollViewに対して機能しません。

一時解決策として、setContentView()でScrollViewをActivityに設置するさいに
LayoutParamsを第二引数として渡してやることでスクロール領域を制限できましたが、
これではひとつのActivityで一度しか実行できない上に、
第二引数として渡したLayoutParams以外の領域に別のViewを配することもできず、
最終的なチャットウィンドウのイメージに到達できなくなってしまいました。
また、ScrollViewに対してのみsetLayoutParams()が働かない他にも
細かい点ではsetOnClickListenerも設置できない等の疑問が出ています。

特に、件名にも挙げた、setLayoutParams()の挙動や問題の解決策について
何かご存じの方がいらっしゃればご教唆いただければ、あるいは情報交換ができればと思います。

以下に、挙動の発生しているソースコードを添付しておきます。
MainActivityとして実行させれば挙動は再現できると思います。


package com.google.groups.chatview;

import android.app.Activity;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;

public class MainActivity extends Activity implements OnClickListener
{
public static Context mContext; //他クラスからこのアクティビティのコンテキストを参照する際に用いる。
public static ScrollView scrollView;
private LinearLayout chatWindowParent;
private ImageView image;
WindowManager windowManager;
Display display;
int dispWidth; // 横幅
int dispHeight; // 縦幅

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("test", "onCreated!");

//アプリケーション・プロセスを親とするContextをstatic変数として設定。他クラス等から参照する。
mContext = this.getApplicationContext();
//mContext = this;

//チャットウィンドウのサイズ指定に使う値を取得する。
windowManager = getWindowManager();
display = windowManager.getDefaultDisplay();
dispWidth = display.getWidth(); // 横幅
dispHeight = display.getHeight(); // 縦幅

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);

//スクロール用のScrollViewを継承したカスタムクラスのViewを生成する。
ScrollView.LayoutParams scrollViewSize = new
ScrollView.LayoutParams(dispWidth, dispHeight*2/3);
scrollView = new ScrollView(this);
//ScrollViewのサイズを指定するが、なぜかここでは機能していないらしい。
scrollView.setLayoutParams(scrollViewSize);
scrollView.setFillViewport(false); //子ビューのサイズに応じてビューのサイズを変えたくない→ホント
に有効?

setContentView(scrollView); //←こちらではなぜかsetLayoutParams()が機能していない!
//setContentView(scrollView, scrollViewSize); //←こちらではなぜか機能する。


//チャットウィンドウを格納するLinearLayoutを生成、表示。
chatWindowParent = new LinearLayout(this);
chatWindowParent.setBackgroundColor(Color.BLACK);
chatWindowParent.setOrientation(LinearLayout.VERTICAL);
//LinearLayoutのサイズを指定。ここではsetLayoutParams()がなぜか有効。
chatWindowParent.setLayoutParams(new
LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT));

//チャットウィンドウをScrollViewに格納。この際、格納するViewのサイズを引数LayoutParamsとして渡すことができ
る。
scrollView.addView(chatWindowParent);

//ダミーの表示ボタン
Button button = new Button(this);
button.setText("button");
button.setOnClickListener(this);
chatWindowParent.addView(button);

//チャットウィンドウにクリックリスナーを設置。
//ScrollViewは自身がクリックに応答する機能を持っているためクリックリスナーを設置できない?
chatWindowParent.setOnClickListener(this);
}

//クリックするたびに画像が増える処理。
@Override
public void onClick(View arg0) {
image = new ImageView(this);
image.setImageBitmap(BitmapFactory.decodeResource(getResources(),
R.drawable.icon));
chatWindowParent.addView(image);
}
}

magpad

未読、
2010/10/07 11:38:152010/10/07
To: 日本Androidの会
こんにちは

動的に設定できるかどうかはわからないですが、ScrollViewに
(レイアウト用のxmlを使う場合の)android:layout_weight="1"を
指定してみてもダメでしょうか?

http://magpad.jugem.jp/?eid=155

はずしてたらごめんなさい。

まち

未読、
2010/10/17 21:07:022010/10/17
To: 日本Androidの会
まちです。
動的にウィンドウ代わりのビューが出たり入ったりする構成にしようと思っていたので
XMLレイアウトは試せませんでしたが、実現可能なことが分かったのはありがたいです。
ScrollView.setLayoutParams(ScrollView.LayoutParams)が動かない原因は相変わらず不明ですが、
ScrollViewの親レイアウトにLinearLayoutを設置し、setContentView(ScrollView,
ScrollView.LayoutParams)で
紹介頂いたURLのように、スクロールビュー領域外にオブジェクトを置くことはできました。
ご教唆ありがとうございました。

でも、もうちょっとスマートな方法があってもよさそうな気がするんですよね……。
そもそもScrollView.setLayoutParams(ScrollView.LayoutParams)が機能しない原因も分からないです
し……。
ここだけはまだ未解決の感じです。

kumagai

未読、
2010/10/18 2:21:212010/10/18
To: android-g...@googlegroups.com
kumaです。

Androidソースツリーを取得し、その配下で jarファイルを作成したいと考えており
ます。

mydroid -> frameworks -> platformlibrary(以下自作) -> src -> com ,,,,,

src フォルダにある Android.mk ファイルにて BUILD_JAVA_LIBRARY及び
BULID_HOST_JAVA_LIBRARYを各々 include して
2個のjarファイルを作成する事まではなんとか出来ました。
下記2行はjarファイルの出力先です。
mydorid -> out -> host -> linux-x86 -> sakusei.jar
mydorid -> out -> target -> product -> generic -> system -> framework ->
sakusei.jar


質問の内容ですが、 java ファイルの中で "import android.util.Log;" を宣言した
時に、
"パッケージ android.util は存在しません。" と コンパイルエラーが出てしまいま
す。

sdkを使っている場合ですと、android-sdk-xxx/platforms/android-x/android.jar
が使えて
いるようなのですが(eclipseから)、 Androidソースツリー配下でには android.jar
が無い
ようでして(prebuildはありますが、それを使ってよいのかも理解できていませ
ん)、どの様に
対応すればよいかわかりかねております。

どなたかご教授頂ければ幸いです。

kuma

Yuki Anzai

未読、
2010/10/18 7:34:242010/10/18
To: android-g...@googlegroups.com
まち さん

 あんざいです。
 
 直接の解決方法ではないですが、チャット形式(gTalkアプリみたいな)のUIが
 実現したいのでしたら、ListView で android:transcriptMode と
 android:stackFromBottom を使うというのはどうですか?
 
 http://y-anz-m.blogspot.com/2010/08/androidthe-world-of-listview-other.html

全員に返信
投稿者に返信
転送
新着メール 0 件