在 RelativeLayout 中设置 align_above 不能以编程方式工作

MBH*_*MBH 1 android android-layout

我需要在屏幕底部添加一个 textView 和 ImageView

我需要隐藏 textView 并以编程方式再次显示

在这里,我有这张图片来解释问题以及应用程序的行为方式

左侧矩形显示显示的 TextView,第二个矩形显示隐藏 Textview:

在此处输入图片说明

我尝试了下面的代码来做到这一点:

1- 我向 ImageView 添加了点击侦听器,隐藏了 TextView 并更改了 ImageView 的 LayoutParams

2-再次单击它会显示 TextView 并将 ImageView 对齐在其上方

但问题是当我运行代码时,ImageView 被卡在屏幕顶部

我正在尝试使用以下代码务实地更改视图的 LayoutParams:

主文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView android:id="@+id/tv1 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" />

    <ImageView android:id="@+id/img" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignAbove="@id/tv1" />

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

和类 MainActivity.java :

public class MainActivity extends Activity {

    TextView tv;
    ImageView image;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        image = (ImageView) findViewById(R.id.img);
        tv = (TextView) findViewById(R.id.tv1);

        image.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                RelativeLayout.LayoutParams imageParams = new RelativeLayout.LayoutParams(
                        RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                //imageParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);

                imageParams.addRule(RelativeLayout.CENTER_HORIZONTAL);

                if(tv.getVisibility() == MyNavigationBar.GONE){
                    tv.setVisibility(MyNavigationBar.VISIBLE);


                    imageParams.addRule(RelativeLayout.ABOVE, R.id.bottomNavigationBar);

                    image.setLayoutParams(imageParams);

                } else {
                    tv.setVisibility(MyNavigationBar.GONE);

                    imageParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);

                    image.setLayoutParams(imageParams);
                }
            }
        });

    }
}
Run Code Online (Sandbox Code Playgroud)

我认为问题在于函数: imageParams.addRule(RelativeLayout.ABOVE, R.id.bottomNavigationBar);

但它不起作用

我还尝试将 Id 手动设置为 textView,例如:

tv.setId(1);
Run Code Online (Sandbox Code Playgroud)

并将之前的更改为:

imageParams.addRule(RelativeLayout.ABOVE, tv1.getId());
Run Code Online (Sandbox Code Playgroud)

也对我不起作用!!

我想知道问题是在我的代码中还是在 android SDK 中!!

Fun*_*onk 5

似乎layout_alignWithParentIfMissing会容易得多:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" />

    <ImageView android:id="@+id/img" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignAbove="@+id/tv1"
        android:layout_alignWithParentIfMissing="true" />

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

并且只在代码中切换 tv1 的可见性:

image.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        if(tv.getVisibility() == View.GONE){
            tv.setVisibility(View.VISIBLE);
        } else {
            tv.setVisibility(View.GONE);
        }
    }
})
Run Code Online (Sandbox Code Playgroud)