Intereting Posts
OnCreate (Bundle savedInstanceState) всегда имеет значение null FragmentTransacation с анимацией слайда / выхода на> 4 производительности Android: может AsyncTask вернуться в другой поток, чем поток пользовательского интерфейса? Проблемы с Android Studio Gradle: обнаружена неправильная конфигурация JDK Gradle Лучшая практика при кешировании файлов на Android Ошибка «adb not installed» при попытке сделать снимок с помощью uiautomatorviewer Сделать метод андроидной активности безопасным потоком Как получить getIntent () для возврата null после операции, вызванной с набором намерений GCM с системой входа в систему Мое приложение работает на android 2.3.3 для android 3.1, но останавливается с ошибкой на 4.0 + «Как приложения Android (Facebook и т. Д.) Установлены на Android-телефон? Аналогичные функции, такие как uitableview в iphone для android? Пользовательские данные byteArray для WebRTC videoTrack Удалить / удалить конкретный URL из истории веб-просмотра Android? Как остановить все звуки в SoundPool?

Как установить размер и расположение в 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? Что я пропустил?

Solutions Collecting From Web of "Как установить размер и расположение в onSizeChanged?"

Добавление следующего в конец 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); } }); ..... } ..... } 

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