- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我创建了一个简单的应用程序来说明在 SDK 17 和 SDK 18 之间包装在 RelativeLayout 中时 LinearLayout 行为的变化。首先,屏幕截图:
当targetSdkVersion为“17”时:
当targetSdkVersion为“18”时:
此 Activity 的布局是:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00ffff"
android:orientation="vertical" >
<include layout="@layout/test_list_item"/>
<ListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:overScrollMode="never"
android:scrollingCache="false" >
</ListView>
</LinearLayout>
text_list_item.xml 是:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ff0000" >
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="#ffff00"
android:padding="10dp"
android:text="foobar"
android:textColor="#000000" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignBottom="@id/text"
android:layout_alignTop="@id/text"
android:background="#00ff00"
android:orientation="horizontal"
android:weightSum="1.0" >
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.5"
android:background="#0000ff" />
</LinearLayout>
</RelativeLayout>
Activity 的 onCreate() 看起来像这样:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
findViewById(R.id.text).bringToFront();
final ListView mListView = (ListView) findViewById(R.id.listview);
mListView.setAdapter(new TestAdapter());
}
TestAdapter 看起来像这样:
public class TestAdapter extends BaseAdapter {
private static final int COUNT = 3;
@Override
public int getCount() {
return COUNT;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean areAllItemsEnabled() {
return true;
}
@Override
public boolean isEnabled(int position) {
return false;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.test_list_item, null);
view.findViewById(R.id.text).bringToFront();
return view;
}
当 target = 17 时,LinearLayout 的 subview 在 ListView 内部和 ListView 外部都被适本地调整为可用宽度的 50%。当 target = 18 时,它在用作列表项的布局时不会调整大小。在这种情况下,它的宽度保持在“0dp”并且永远不会调整大小。
理想情况下,我想以 SDK 19 为目标。不过,为了做到这一点,我以某种方式适应了这种行为变化。关于如何实现这一点有什么想法吗?
顺便说一句,布局如此复杂和“怪异”是有原因的;我意识到有更直接的方法可以实现这种特殊的视觉效果。
编辑:
为了提供更多关于我为什么使用这种病态布局的信息:它用于“仪表”。 LinearLayout 内的 View 使用 ScaleAnimation 拉伸(stretch)或收缩,以便它占据总可用宽度的所需百分比。棘手的是我需要在仪表顶部叠加文本,并且我希望仪表的高度由文本确定。
所以外部 RelativeLayout 应该“与其父级一样宽”但只能“与其包含的 TextView 一样高”。 RelativeLayout 中的 LinearLayout 应该与其父级一样宽和高。 LinearLayout 中的 View 应该和包含它的 LinearLayout 一样高,但只有一半宽。
这正是我在以 SDK 17 和/或为目标时在 SDK 18+ 布局未用作 ListView 项目的内容时得到的行为。
编辑
在开发者组上发布:
https://groups.google.com/forum/#!msg/android-developers/KuoY5Tklyms/TbNq6ndD_PwJ
最佳答案
改变
final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.test_list_item, null);
到:
final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.test_list_item, parent, false);
我想你会有更好的运气。
更新
好吧,这就是我可以告诉你的。
如果启动层次结构 View ,您将看到在“内部 ListView”场景中提供蓝色背景的 View
的高度为 0。根据您问题的其他答案,宽度正确,这表明问题与重量无关。
如果你看the source code to RelativeLayout
,他们确实在 android:targetSdkVersion
为 17 与 18+ 之间的分界线上添加了一些智能来改变行为。我的猜测是您被 mAllowBrokenMeasureSpecs
绊倒了,在某些与 ListView
容器相关的场景中,但这只是一个猜测。当它是一个简单的容器时,当我写了一个容器,并且当我睡了一整夜时,我有足够的时间摸索容器的所有布局/测量内容——理解 RelativeLayout
有限的 sleep 超出了我的能力。我一直在戳戳你的样本,尝试各种方法看它们是否能解决问题,但没有结果。
关于您在我戳这里时发布的编辑:
原则上,您不需要将基本布局设为 RelativeLayout
。 FrameLayout
应该也能正常工作,因为您需要它做的就是能够在 Z 轴上堆叠东西并能够使您的标签居中。话虽这么说,但沿着这条路我得到了更奇怪的结果,尽管这些结果似乎与 targetSdkVersion
无关,所以我可能只是在某个地方搞砸了
即使您坚持使用 RelativeLayout
,您也不需要 LinearLayout
。在运行时,你知道你的宽度,所以你应该为仪表的宽度设置动画,而不是它的重量。因此,只需将 View
放在 RelativeLayout
(或 FrameLayout
)中就足够了。
但我很乐意同意这是一种奇怪的行为。
关于android - 如何解决 sdk 17 和 18 之间列表项布局行为变化的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21442381/
如标题所示,ans_list是一个答案列表,ans_index是一个数字(答案在词汇表中的索引,但与atm无关) 这里生成的 tree.anslist 是什么? (例如,仅针对第一个),忽略迭代。 f
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将具有一个元素的东西拿走。 这与 How do I “flatte
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将带有一个元素的东西拿走。 这与 How do I “flatte
这个问题已经有答案了: Convert nested list to 2d array (3 个回答) 已关闭 7 年前。 java中有没有快捷方式可以转换 List> 到 String[][] ?
我在排序时遇到问题 List> 。我创建了一个自定义比较器,在其中编写了对数据进行排序的代码。 public class CustomComparator implements Comparator
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Java Generics: Cannot cast List to List? 我只是想知道为什么下面的java代
试图想出一个 LINQy 方法来做到这一点,但我什么也没想到。 我有一个对象列表<>,其中包含一个属性,该属性是逗号分隔的字母代码列表: lst[0].codes = "AA,BB,DD" lst[1
假设我有这些任务: points = [] point = (1, 2) 我怎么会这样做: points += point 它工作得很好,并且给了我点 = [1, 2]。但是,如果我这样做: poin
如何在 scala 中将 List[Task[List[Header]]] 类型转换为 Task[List[Header]]。 我有一个方法返回 Task[List[Header]] 并多次调用 do
如何在 Java 中查找二维列表的元素? 我有一个参数为 List> 的函数我想知道如何找到这个列表的行和列。 最佳答案 如果你喜欢 List> obj 然后你就可以像这样访问 obj.get(cur
分配 List到 List工作正常。 分配 List>到 List>不编译。 代码 public class Main { public static void main(String[] a
我正在用 Java 编写一个方法,该方法必须接收并迭代 Serializable 的 List。 有什么区别: public void myMethod(List list) { } 和 public
我看到很多人想用 mvvm 更新网格/列表/树的一部分,但他们不想刷新整个列表。 对于所有遇到此问题的人,我做了以下示例。 希望这对你有用。 最佳答案 这是一个简单的例子。整个代码中最重要的是: Bi
我正在为现有的 C++ 库编写包装器,该库使用列表,其中 T 是自定义结构。我被建议使用 vector 而不是列表,但我试图避免修改库。 为了更好地理解这个场景,我做了一个简单的应用程序,使用一个列表
List list List list 这两种声明有什么区别吗? 谢谢, 最佳答案 是的。 List可以包含所有派生自 Base 的不同事物的混合物. List包含同质项(从某种意义上说,它们必须全部
有人可以尽可能详细地解释以下类型之间的区别吗? List List List 让我更具体一点。我什么时候想使用 // 1 public void CanYouGiveMeAnAnswer(List l
我有一个元组列表,每个元组都是一对列表。所以我的数据看起来像: mylist = [(['foo', 'bar'], ['bar', 'bar']),(['bar', 'bar'],['bar', '
也许是一个时髦的标题,但我遇到了以下问题: 给定一个类型为 (a * b) list 的列表,我想创建一个类型为 (a * b list) list 的新列表。一个例子: 给定列表 let testL
我是一名优秀的程序员,十分优秀!