1

現在、TextView の一番下までスクロールしている ScrollView 内に TextView があります。

TextView は常に更新されて動的に入力されます (TextView は基本的にアクション コンソールとして機能します)。

ただし、私が抱えている問題は、動的テキストが ScrollView に追加されると、ユーザーがテキストを越えて黒いスペースにスクロールできることです。これは、TextView にコンテンツが追加されるたびに増加します。

さまざまなアプローチを試しましたが、どれも正しい結果をもたらしませんでした。maxLines を使用したり、レイアウトの高さを定義したりすることはできません。これは、表示される行数が絶えず変化するさまざまな画面サイズに対して動的にする必要があるためです。

私はもともとこれをプログラム的に行っていましたが、これはランダムな時間にクラッシュしていたため、レイアウトに保持したいと思います(使いやすさが向上しました)、以下のコード例:

final int scrollAmount = update.getLayout().getLineTop(update.getLineCount()) - update.getHeight();
if(scrollAmount > 0)
{
    update.scrollTo(0, scrollAmount);
}

以下のコードは、コンテンツが追加されたときに TextView を自動的に一番下にスクロールするために使用されている現在のレイアウト xml です。

<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_above="@+id/spacer2"
    android:layout_below="@+id/spacer1"
    android:fillViewport="true" >
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
        <TextView
            android:id="@+id/battle_details"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:textSize="12dp"
            android:layout_gravity="bottom" />
    </LinearLayout>
</ScrollView>

ここに画像の説明を入力

編集 - これは、TextView にテキストを追加するために使用しているコードです。

private void CreateConsoleString()
{
    TextView update = (TextView)findViewById(R.id.battle_details);
    String ConsoleString = "";
    // BattleConsole is an ArrayList<String>
    for(int i = 0; i < BattleConsole.size(); i++)
    {
        ConsoleString += BattleConsole.get(i) + "\n";
    }
    update.setText(ConsoleString);
}

編集 2 - 次のように BattleConsole にコンテンツを追加します。

BattleConsole.add("Some console text was added");
CreateConsoleString();

私の唯一の問題を要約すると、ユーザーがテキストの最後の行でスクロールするのを止めるのではなく、ScrollView および/または TextView が下部に空白を追加していることです。私がどこで間違っているのかについての助けや指導は大歓迎です。

4

1 に答える 1

1

電話するとこんな感じ

BattleConsole.get(i) 

時々空を返すStringので、基本的には新しい行をに追加するだけですTextView

たとえば、これを行うことができます。

StringBuilder consoleString = new StringBuilder();
// I'm using a StringBuilder here to avoid creating a lot of `String` objects
for(String element : BattleConsole) {
    // I'm assuming element is not null
    if(!"".equals(element)) {
        consoleString.append(element);
        consoleString.append(System.getProperty("line.separator")); // I'm using a constant here.
    }
}
update.setText(consoleString.toString());

コードを投稿してBattleConsoleいただければ、さらにお役に立てます。

脚注として: Java では camelCase を使用することをお勧めします。慣習に従って、Java ではクラス名だけが大文字で始まります。

于 2012-11-05T10:45:36.720 に答える