如何在onSizeChanged中设置大小和布局?

我不能让我的元素,例如ListView ,正确resize。

我有一个ListActivitysearch,仪表板,一个编辑框和一个列表视图。 这个想法是在键盘显示时隐藏操作栏。

我扩展了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下方有间隙。 只要任何graphics改变(例如在编辑框中写入) ListView填补了空白。 隐藏键盘时,相反的行为也会出现。

在这里输入图像说明

[编辑]

改变其他布局也会出现同样的问题。 更改onSizeChanged中的东西的Visibility直接显示,但直到其他用户操作重绘这些视图才会显示更改的大小和边距。 无效从onSizeChanged不起作用。

[/编辑]

我试图刷新graphics:

  • invalidate自定义的LinearLayout和ListView invalidate ( 这里推荐)
  • 在列表的适配器上的notifyDataSetChanged
  • forceLayout

…等等,没有成功。 为什么ListView不是一开始就resize的? 在扩展的LinearLayout中,我必须重写onLayout吗? 我错过了什么?

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_parentwrap_content可以强制它工作…

正如我所说…一个远射!

您可以强制ListView重绘更改其高度1px并调用

requestLayout()

通过向EditText注册一个setOnFocusChangeListener和一个setOnClickListener ,可以做你想做的setOnFocusChangeListener

当涉及到导航时,有很多不同的场景需要考虑,而且可能需要更改某些布局以适应某些布局。

无论如何,首先通过覆盖onSizeChanged来显示隐藏的元素,当后退button被触摸。

 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并将其传递给它。 然后setOnFocusChangeListener被注册来处理EditText焦点改变的事情。 当EditText已经有焦点时,setOnClickListener用来隐藏元素。

 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); } }); ..... } ..... } 

我稍后会提供一个工作示例,但现在就要运行了。