Intereting Posts
Замена автоматической игровой карты в Android-браузере? Как я могу проверить, что URI изображения действителен в Android? Улучшение скорости getpixel () и setpixel () на Android Bitmap Как запрашивать разрешения от службы в Android Marshmallow Не удается правильно установить google-play-сервисы в Eclipse (пытаясь заставить карты работать) Android SDK в Eclipse дает ошибку об истекшем сертификате Тайм-аут для запроса сервера, сделанный с использованием «Volley» только на Android, а не на iOS IllegalStateException: <MyFragment> в настоящее время отсутствует в FragmentManager Android Opengl ES: GLUtils.glTexImage2D вызывает GL_INVALID_ENUM Приложение падает после первого входа в Facebook Предварительный просмотр Android Studio Designer не показывает правильные размеры Как можно создать глобальную тему с разными цветами текста TextView и Spinner? Цвет фона Android ListView всегда показывает серый цвет Используйте только графические элементы XHDPI в приложении Android? Android – изображение в центре во всех разрешениях экрана

Как установить размер и расположение в onSizeChanged?

Я не могу заставить мои элементы, например ListView , правильно изменять размер.

Я получил ListActivity для поиска, с панелью управления, editbox и listview. Идея состоит в том, чтобы скрыть панель действий, пока отображается клавиатура.

Я расширил LinearLayout , чтобы прослушать изменения размера вида (как рекомендовано здесь ):

 public class SizeChangingLinearLayout extends LinearLayout { //... @Override protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) { View actionbar = mainView.findViewById(R.id.actionbar); if (yNew > yOld) actionbar.setVisibility(View.VISIBLE); else if (yNew < yOld) actionbar.setVisibility(View.GONE); super.onSizeChanged(xNew, yNew, xOld, yOld); } } 

Скрытие / показ панели действий работает так, как ожидалось, но есть пробел ниже ListView той же высоты, что и скрытая панель действий. Как только изменения графики (например, запись в поле редактирования), ListView заполняет пробел. Аналогичное поведение появляется в обратном порядке, когда скрывается клавиатура.

Введите описание изображения здесь

[Редактировать]

Такая же проблема возникает и при изменении другого макета. Изменение Visibility вещей в onSizeChanged отображается напрямую, но изменение размеров и полей не показывается, пока некоторые другие действия пользователя не перекроют эти представления. Недействительность не работает из onSizeChanged .

[/Редактировать]

Я попытался обновить графику:

  • Аннулировать как пользовательские LinearLayout, так и ListView (как рекомендуется здесь )
  • notifyDataSetChanged в адаптере списка
  • forceLayout

… и многое другое, без успеха. Почему ListView не изменяет размер сначала? Должен ли я переопределить onLayout в моем расширенном LinearLayout? Что я пропустил?

Добавление следующего в конец onSizeChanged() решит его:

 Handler handler = new Handler(); handler.post(new Runnable() { @Override public void run() { requestLayout(); } }); 

См. Ответ на этот вопрос: Представления внутри пользовательской ViewGroup не отображаются после изменения размера

Это может быть длинный выстрел …

Вы пытались играть с настройкой android:layout_height="" для ListView ?

Возможно, использование match_parent или wrap_content может заставить его работать …

Как я уже сказал … длинный выстрел!

Вы можете заставить ListView перерисовать, изменив его высоту на 1px и вызвав

requestLayout()

Возможно сделать то, что вы хотите, зарегистрировав setOnFocusChangeListener и setOnClickListener в EditText .

Существует множество различных сценариев, которые следует учитывать, когда речь заходит о навигации, и что-то может потребоваться изменить для работы с определенным макетом.

В любом случае, начните с переопределения onSizeChanged, чтобы показать скрытый элемент, когда нажата кнопка «Назад».

 public class MyLinearLayout extends LinearLayout { private MyListActivity mMyListActivity; public MyLinearLayout(Context context) { super(context); } public MyLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); } public void setMyListActivity(MyListActivity mla) { mMyListActivity = mla; } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { // show the element when we get more room if (h > oldh) { if (mMyListActivity != null) { mMyListActivity.showBar(); } } super.onSizeChanged(w, h, oldw, oldh); } } 

В ListActivity мы захватываем MyLinearLayout и передаем this ему. Затем записывается setOnFocusChangeListener для обработки вещей, когда изменяется фокус EditText. SetOnClickListener используется, чтобы скрыть элемент, когда EditText уже имеет фокус.

 public class MyListActivity extends ListActivity { private ArrayList<MyData> mDataList = new ArrayList<MyData>(); private MyLinearLayout mMyLinearLayout; private LinearLayout mHideMeLinearLayout; private EditText mEditText; public void showBar() { if (mHideMeLinearLayout != null) { mHideMeLinearLayout.setVisibility(View.VISIBLE); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get MyLinearLayout and pass this to it. mMyLinearLayout = (MyLinearLayout) findViewById(R.id.myLinearLayout); mMyLinearLayout.setMyListActivity(this); // the LinearLayout to be hidden mHideMeLinearLayout = (LinearLayout) findViewById(R.id.LinearLayoutToHide); mEditText = (EditText) findViewById(R.id.editText); mEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { InputMethodManager imm = (InputMethodManager) getSystemService(Service.INPUT_METHOD_SERVICE); if (hasFocus) { imm.showSoftInput(mEditText, 0); mHideMeLinearLayout.setVisibility(View.GONE); } else { imm.hideSoftInputFromWindow(mMyLinearLayout.getWindowToken(), 0); mHideMeLinearLayout.setVisibility(View.VISIBLE); } } }); mEditText.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mHideMeLinearLayout.setVisibility(View.GONE); } }); ..... } ..... } 

Я приведу рабочий пример позже, но сейчас должен бежать.