チャットを組み込んだアプリケーションを開発しています。新しいメッセージを入力すると、内部メモリのファイルに保存されます。また、新しいメッセージを入力すると、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>
誰でも問題を見たり、理解できますか?
前もって感謝します、
リカルド・アメンドエイラ