作为一个相对新手,在Android平台上我遇到了很多困难,像我一样的人也很多。我不知道到目前为止我已经浪费了多少时间 - 即使计算它们也是可怕的。
基本上,我想在点击按钮后将新的TextView(或任何其他View)添加到LinearLayout中。以下是代码的这部分:
public void btnClick(View view) {
final LinearLayout ll = (LinearLayout) findViewById(R.id.test_story_screen_layout);
//checking if child is being added - it is, this value is increase with every button click
android.util.Log.d("child: ", Integer.toString(ll.getChildCount()));
android.util.Log.d("height: ", Integer.toString(ll.getMeasuredHeight()));
ll.post(new Runnable() {
public void run() {
final TextView tv = new TextView(MainActivity.this);
tv.setText("new one " + (new Random()).nextInt());
tv.setTextColor(Color.YELLOW);
LayoutParams lp = new LayoutParams(200, 500);
tv.setLayoutParams(lp);
tv.setVisibility(View.VISIBLE);
ll.addView(tv, ll.getChildCount());
//checking if the run() is called - it is
ll.setBackgroundColor(Color.GREEN);
}
});
ll.requestLayout(); //invalidate() and postInvalidate() also not working
}
但是新增的View不可见(但已作为LinearLayout的子项添加)。
经过数小时的检查,我只发现当我替换了这行代码时:
ll.addView(tv, ll.getChildCount());
使用以下内容:
ll.addView(tv, ll.getChildCount() - 1);
新视图已经可见,但它替换了先前的视图 - 这是不期望的。
我已经检查过一些解决方案,例如这个:刷新LinearLayout后添加视图 它们没有帮助我解决问题。
更新:
在XML中预定义两个视图时,线性布局看起来很好(如下面的代码所示)。以下是XML的有趣部分:
<LinearLayout
android:id="@+id/test_story_screen_layout"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
android:layout_margin="16dp" >
<ImageView
android:id="@+id/imageView1"
android:src="@drawable/example"
android:layout_width="16dp"
android:layout_height="16dp" />
<TextView
android:id="@+id/textView1"
android:text="Hello World!"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
我觉得没有什么不寻常的。因此,这两个视图(图像和文本)当然是可见的。然后,通过上面代码中的btnClick()方法动态地将任何新的TextView添加到此LinearLayout中时,它是不可见的,但实际上已添加到布局中,因为每次添加子视图(=按钮点击)时,ll.getChildCount()都会增加。
为了进一步测试这个问题,在btnClick()方法的末尾添加了这两行代码:
android.util.Log.d("tv.getMeasuredWidth: ", Integer.toString(tv.getMeasuredWidth()));
android.util.Log.d("tv.getMeasuredHeight: ", Integer.toString(tv.getMeasuredHeight()));
我猜问题出在电视(TextView)上而不是线性布局(LinearLayout),因为电视的宽度和高度都为0。