1

チャットを組み込んだアプリケーションを開発しています。新しいメッセージを入力すると、内部メモリのファイルに保存されます。また、新しいメッセージを入力すると、editText の下部 (メッセージがある場所) まで自動的にスクロールし、最初の試行では正常に動作しますが、アプリケーションを再度開いてファイルから履歴を読み込むと、自動スクロールは適切に機能しなくなりました。これは、一番下までスクロールしても、テキストの最後の行が非表示になるためです。

.java ファイルは次のとおりです。

public class ChatActivity extends Activity {

private static EditText messageHistory;
//
private EditText messageInput;
//
private Button sendButton;
//
private ScrollView scroller;

@Override
public void onCreate (Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.chat);

    //Prevents the keyboard from appearing when not rquested
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

    ProjectData.chatLogFile = new FileHandler(getApplicationContext(), ProjectData.CHAT_LOG_FILE);
    ProjectData.chatLogFile.create();

    getViews();

    getChatLog();

    addListennerOnButton();
}

/**
 * Finds all the views in this activity and stores them in global variables
 */
private void getViews ()
{
    messageHistory = (EditText) findViewById(R.id.messageHistory);
    messageInput = (EditText) findViewById(R.id.messageInput);
    sendButton = (Button) findViewById(R.id.sendButton);
    scroller = (ScrollView) findViewById(R.id.historyScroller);
}

private void getChatLog ()
{
    messageHistory.setText(ProjectData.chatLogFile.getData());
    scroller.scrollTo(0, messageHistory.getBottom());
}

private void addListennerOnButton ()
{
    sendButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            if (!messageInput.getText().toString().equals(""))
            {
                newMessage(messageInput.getText().toString(), 0);
                scroller.scrollTo(0, messageHistory.getBottom());
                messageInput.setText("");
            }
        }
    });
}

public static void newMessage (final String msg, int id)
{
    StringBuilder strBuilder = new StringBuilder();
    switch (id) {
        case 0: strBuilder.append("User:\n");break;
        case 1: strBuilder.append("PC Medic:\n");
        default: break;
    }

    strBuilder.append(msg + "\n");
    messageHistory.append(strBuilder.toString());
    messageHistory.refreshDrawableState();
    ProjectData.chatLogFile.addData(strBuilder.toString());
}

@Override
public boolean onCreateOptionsMenu (Menu menu)
{
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) 
{
    Intent intent;
    switch (item.getItemId()) {
        case R.id.menuFAQ:
            intent = new Intent();
            intent.setClass(getApplicationContext(), FAQActivity.class);
            startActivity(intent);
            return true;
        case R.id.menuConfig:
            intent = new Intent();
            intent.setClass(getApplicationContext(), PrefActivity.class);
            startActivity(intent);
            return true;
        case R.id.menuAbout:
            intent = new Intent();
            intent.setClass(getApplicationContext(), AboutActivity.class);
            startActivity(intent);
            return true;
        case R.id.menuExit:
            intent = new Intent();
            intent.setClass(getApplicationContext(), BackgroundService.class);
            stopService(intent);
            setResult(ProjectData.EXIT_CODE);
            finish();
            return true;
        default:
            return false;
    }
}
}

および .xml ファイル:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
android:id="@+id/chatMainLayout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<ImageView
    android:id="@+id/logoChat"
    android:layout_width="match_parent"
    android:layout_height="90dp"
    android:scaleType="fitStart"
    android:adjustViewBounds="true"
    android:src="@drawable/logo_top"
    android:contentDescription="@string/logo" />


<ScrollView
    android:id="@+id/historyScroller"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:fillViewport="true"
    android:layout_weight="1" >

    <EditText
        android:id="@+id/messageHistory"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:background="@color/black"
        android:clickable="true"
        android:editable="false"
        android:focusable="false"
        android:gravity="top"
        android:inputType="textMultiLine"
        android:textColor="@color/white" />
</ScrollView>

<EditText 
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:inputType="none"
    android:focusable="true" />


<LinearLayout
    android:id="@+id/chatBottomLayout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >


    <EditText
        android:id="@+id/messageInput"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:maxHeight="60dp"
        android:nextFocusLeft="@id/messageInput"
        android:nextFocusUp="@id/messageInput"
        android:hint="@string/message_input"
        android:layout_weight="1"
        android:textColor="@color/gray"
        style="@style/textInput" />
    <Button 
        android:id="@+id/sendButton"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="3"
        android:text="@string/send" />

</LinearLayout>

誰でも問題を見たり、理解できますか?

前もって感謝します、

リカルド・アメンドエイラ

4

2 に答える 2

2

サナの答えにより、私は自分の問題を解決することができました。TextView がウィンドウの境界を再計算できるようにする必要があると思うので、 post Handlerで scrollTo() メソッドをラップしてみてください。

以下の私のコードを参照してください:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    scrollView.post(new Runnable() {
        @Override
        public void run () {
            scrollView.scrollTo(0, 500);
        }
    });
}
于 2013-01-07T13:54:46.850 に答える
0

ここでの問題は、ビューをレイアウトすることです。onCreate メソッドでビューをレイアウトすると、ビューは完全には膨張せず、最初の行までスクロールアウトする際に適切に機能するため、メソッドを配置することをお勧めしgetChatLog();ます

@Override
 public void onWindowFocusChanged(boolean hasFocus) {
  // TODO Auto-generated method stub
  super.onWindowFocusChanged(hasFocus);
  getChatLog();
 }

動作しない場合はお知らせください。

これは非常に興味深い質問です。

于 2012-06-05T18:00:01.177 に答える