Вопрос:
Я хочу создать экран чата, который имеет EditText и кнопку внизу (завернутый в LinearLayout), и ScrollView для сообщений вверху. Проблема в том, что когда пользователь нажимает EditText, и клавиатура открывается, ScrollView выйдет из экрана в результате перемещения вверх. Я хотел бы переместить макет (с помощью EditBox и Button) над клавиатурой, а ScrollView – для изменения размера экрана. Проблема показана на рисунках ниже:
Как вы можете видеть, линия, которая пишет “Чат” (левое изображение), исчезла в правильном изображении.
Я использую этот код XML:
<?xml version=»1.0″ encoding=»utf-8″?> <LinearLayout xmlns:android=»http://schemas.android.com/apk/res/android» xmlns:app=»http://schemas.android.com/apk/res-auto» xmlns:tools=»http://schemas.android.com/tools» android:layout_width=»match_parent» android:layout_height=»match_parent» android:padding=»15sp» android:orientation=»vertical» android:background=»#ccdcf7″ tools:context=»com.orionz.sockettest.ChatActivity»> <ScrollView android:id=»@+id/scroll» android:layout_width=»match_parent» android:layout_height=»wrap_content» android:layout_weight=»15″ android:isScrollContainer=»false»> <LinearLayout android:layout_width=»match_parent» android:layout_height=»wrap_content» android:orientation=»vertical»> <TextView android:id=»@+id/chatBox» android:layout_width=»match_parent» android:layout_height=»wrap_content» android:padding=»5dp» android:text=»Chatn» android:textColor=»#000000″ android:textIsSelectable=»true» android:textSize=»22dp» /> </LinearLayout> </ScrollView> <LinearLayout android:layout_width=»match_parent» android:layout_height=»wrap_content» android:layout_weight=»1″ android:gravity=»center|bottom» android:orientation=»horizontal»> <EditText android:id=»@+id/msgInput» android:layout_width=»wrap_content» android:layout_height=»wrap_content» android:layout_weight=»0.8″ android:ems=»10″ android:hint=»Message…» android:inputType=»text» /> <Button android:id=»@+id/sendButton» android:layout_width=»wrap_content» android:layout_height=»wrap_content» android:layout_weight=»0.2″ android:background=»@drawable/mybutton» android:padding=»5sp» android:text=»Send» android:textColor=»#ffffff» android:textSize=»20sp» /> </LinearLayout> </LinearLayout>
Я видел много ответов, таких как установка android:windowSoftInputMode но никто не работал. Я использую Android Studio. Любая помощь будет оценена по достоинству.
Лучший ответ:
Наконец, я обнаружил, что было не так в моем случае.
- Тема была полноэкранной. В стиле деятельности у меня была эта строка, которая вызвала проблему:
<item name=»android:windowFullscreen»>true</item>
- В java-коде я дал команду открыть клавиатуру в начале действия:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
который также был частью проблемы
- После добавления свойства adjustResize к активности в манифесте все работало нормально:
android:windowSoftInputMode=»adjustResize»
Ответ №1
Попробуйте заменить ScrollView на ListView следующим образом:
<ListView android:id=»@+id/list_view» android:layout_width=»wrap_content» android:layout_height=»0dp» android:layout_weight=»1″> </ListView>
сохраните все сообщения в ArrayList и установите адаптер в ListView, который вы создали:
ListView listView=(ListView) findViewById(R.id.list_view); ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,ArrayList); listView.setAdapter(adapter);
Наконец, добавьте слушателя на вашу кнопку, пишущую эти строки:
EditText editText= (EditText) findViewById(R.id.msgInput); ArrayList.add(editText.getText().toString()); adapter.notifyDataSetChanged(); Ответ №2
Wrap Scrollview на весь макет.
т.е. поместите editText и кнопку внутри Scrollview и установите scrollView Height для android:layout_height=»match_parent»