Android 将按钮放在ListView下方以填充所有可用空间,但按钮应具有最小高度
如何将按钮放置在ListView下方,以遵循以下条件:Android 将按钮放在ListView下方以填充所有可用空间,但按钮应具有最小高度,android,Android,如何将按钮放置在ListView下方,以遵循以下条件: 按钮应填充ListView下面的所有可用空间 如果ListView内容太大,按钮应出现在ListVew下方的底部,并且应滚动ListView 我同意使用xml布局似乎不可能实现这样的布局。 您可以尝试动态地执行此操作 就像一个概念的证明。 创建主题为的测试应用程序: 创建活动布局activity\u main.xml如下所示: <?xml version="1.0" encoding="utf-8"?> <Relat
- 按钮应填充ListView下面的所有可用空间
- 如果ListView内容太大,按钮应出现在ListVew下方的底部,并且应滚动ListView
我同意使用xml布局似乎不可能实现这样的布局。
您可以尝试动态地执行此操作 就像一个概念的证明。 创建主题为的测试应用程序:
创建活动布局activity\u main.xml
如下所示:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/root"
>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/button"
android:layout_alignParentTop="true"/>
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:text="Button"/>
</RelativeLayout>
在活动中做以下事情:
public class MainActivity extends Activity {
private Button mButton;
private ListView mListView;
private static final int BUTTON_MIN_HEIGHT = 300;
private ArrayAdapter<String> mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final List<String> values = new ArrayList<String>();
mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, values);
mListView = (ListView) findViewById(R.id.listView);
mListView.setAdapter(mAdapter);
mButton = (Button) findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
values.add("Something");
invalidateViews();
}
});
}
private int getScreenHeight() {
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
return size.y;
}
private int getListViewHeight() {
int listviewElementsHeight = 0;
for (int i = 0; i < mAdapter.getCount(); i++) {
View mView = mAdapter.getView(i, null, mListView);
mView.measure(
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
listviewElementsHeight += mView.getMeasuredHeight();
}
return listviewElementsHeight;
}
private void invalidateViews() {
mAdapter.notifyDataSetChanged();
int buttonHeight = getScreenHeight() - getListViewHeight();
Log.e(MainActivity.class.getSimpleName(), "Button height: " + buttonHeight);
if (buttonHeight < BUTTON_MIN_HEIGHT) {
buttonHeight = BUTTON_MIN_HEIGHT;
}
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mButton.getLayoutParams();
layoutParams.height = buttonHeight;
mButton.setLayoutParams(layoutParams);
}
}
公共类MainActivity扩展活动{
私人按钮;
私有列表视图;
专用静态最终整型按钮\最小\高度=300;
私人ArrayaAdapter mAdapter;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
最终列表值=新的ArrayList();
mAdapter=newarrayadapter(这个,android.R.layout.simple_list_item_1,android.R.id.text1,值);
mListView=(ListView)findViewById(R.id.ListView);
mListView.setAdapter(mAdapter);
mButton=(按钮)findviewbyd(R.id.Button);
mButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
添加(“某物”);
失效视图();
}
});
}
private int getScreenHeight(){
Display Display=getWindowManager().getDefaultDisplay();
点大小=新点();
display.getSize(size);
返回大小.y;
}
private int getListViewHeight(){
int listviewElementsHeight=0;
对于(int i=0;i
在这个例子中,我们在开始时有一个全屏按钮和一个空列表视图。
单击按钮时,列表视图中将再添加一个项目,按钮大小将重新计算并应用正确的值。
有一些方法可以帮助我们计算所需的按钮高度。
我们提供BUTTON\u MIN\u HEIGHT
常量来定义按钮的最小高度。
按钮高度我们只需从屏幕高度减去listview的高度即可计算
这个例子很可怕,没有得到优化。问题:
- 计算列表视图的高度非常长。如果您知道列表视图元素的确切高度,并且知道列表视图包含的项目只有此高度,则可以计算项目的高度一次,然后将项目的高度乘以项目数来计算列表视图的高度
- 基本上你还需要减去状态栏高度和动作栏高度,如果你有它们的话(为了简单起见,在这个例子中我使用了NoActionBar.Fullscreen主题)
- 您需要在
文件中定义最小按钮高度,并加载其值dimens.xml
。在本例中,为了简单起见,我使用常量值onCreate
你可以发布一些图片,看看它是什么样子,或者发布你的代码,不管你尝试了什么。只是添加了一些插图。我认为你不能用简单的方法来做到这一点。因为ListView高度!=ListView内容高度。因此ListView不能具有wrap_内容高度(在本例中,它将始终为0)。因此,如果您想这样做smth,您需要添加大量代码,这些代码将在绘制前计算listView的内容高度,并以编程方式更改高度。任何建议都将受到欢迎,谢谢。如果列表视图项的高度可变怎么办?我认为在这种情况下,您必须将列表视图的高度计算为每个列表视图项高度的总和。。。