Проблемы с scrollTo () в Android

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>

Может ли кто-нибудь увидеть или даже понять проблему, пожалуйста?

Заранее спасибо,

Рикардо Амендейра

Теги:
scroll
android-edittext
chat
scrollview

2 ответа

2
Лучший ответ

Ответ Саны позволил мне решить мою собственную проблему. Я думаю, вам нужно разрешить TextView пересчитывать границы окон, поэтому попробуйте обернуть свой метод scrollTo() в обработчике сообщений.

Смотрите мой код ниже:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    scrollView.post(new Runnable() {
        @Override
        public void run () {
            scrollView.scrollTo(0, 500);
        }
    });
}
  • 1
    Да, я действительно смог решить это таким образом (извините, что не опубликовал это: S). Вот мой код: chatScrollView.postDelayed(new Runnable() { @Override public void run() { chatScrollView.fullScroll(ScrollView.FOCUS_DOWN); } }, 200L);
  • 0
    @RicardoAmendoeira Это решение delay является единственным решением, которое сработало для меня. Спасибо
0

Проблема здесь заключается в том, чтобы выставить свое мнение. Когда вы размещаете свое представление в методе onCreate, он не полностью завышен и работает правильно при прокрутке до первой строки, поэтому вы можете поместить свой метод getChatLog(); в

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

Дайте мне знать, если это не работает.

Это очень интересный вопрос.

  • 0
    Спасибо! к сожалению, я смогу проверить это только завтра, но я дам вам знать, если это сработает!
  • 0
    Я только что проверил, и это не работает для меня .... Есть ли способ заставить метод onWindowFocusChanged быть вызванным? Потому что он вызывается только рядом с onCreate .... Также я поместил scroller.scrollTo (0, messageHistory.getBottom ()); в методе также .. любая дальнейшая помощь будет высоко ценится!
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню