android - 使视图“GONE”导致其下方的视图也不可见

Posted

技术标签:

【中文标题】android - 使视图“GONE”导致其下方的视图也不可见【英文标题】:android - Making a view "GONE" results in the view below it to be invisible as well 【发布时间】:2015-03-06 01:39:41 【问题描述】:

我是 android 新手,我正在开发一个应用程序几个星期。

正如标题所说,我遇到的问题是,当我想以编程方式将 Spinner 设置为 GONE 时,ListView 下方的 RelativeLayout 也消失了。

这里是xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical" >

    <Spinner
        android:id="@+id/tableSelector"
        android:layout_
        android:layout_ />


    <ListView
        android:id="@+id/insertList"
        android:layout_
        android:layout_
        android:layout_below="@+id/tableSelector"
        android:layout_above="@+id/saveButton"
        android:background="#aaffffff"
        android:divider="#11000000"
        android:dividerHeight="4dp"
        android:visibility="gone" >

    </ListView>

   <Button
        android:id="@+id/saveButton"
        android:layout_
        android:layout_
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:text="@string/button_save"
        android:visibility="visible" />

</RelativeLayout>

这是我以编程方式设置它的方式:

switch(spinnerFlag)

    case SPINNER_HIDDEN: tableSelector.setVisibility(View.GONE); break;
    case SPINNER_VISIBLE: tableSelector.setVisibility(View.VISIBLE); break;
    case SPINNER_VISIBLE_DISABLED: tableSelector.setVisibility(View.VISIBLE); 
                                      tableSelector.setEnabled(false); 
                                      break;
    default: Log.d("onActivityCreated - InserFragment", "Spinner flag < " + spinnerFlag + " > does not exist. Spinner is now visible enabled.");

这适用于SPINNER_VISIBLESPINNER_VISIBLE_DISABLED,但是当将其设置为SPINNER_HIDDEN 时,ListView 也会消失。

更新 正如 Psy Duck 和 Nguyen Doan Tung 建议的那样,我将layout_alignWithParentIfMissing 属性添加到ListView。但是我注意到它仍然没有工作。我在 xml 中将 ListView 的可见性设置为 visible 并显示它,但它是空的。 所以它解决了我遇到的问题,但我现在有另一个问题,ListView 是空的(我会再次提到,当(spinnerFlag == SPINNER_VISIBLE || spinnerFlag == SPINNER_VISIBLE_DISABLED) 时,它工作得很好)

这是我的代码的较大部分:

public void onActivityCreated(Bundle savedInstanceState) 
        super.onActivityCreated(savedInstanceState);

        insertList = (ListView) getActivity().findViewById(R.id.insertList);
        /* Some code */

        tableSelector = (Spinner) getActivity().findViewById(R.id.tableSelector);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_dropdown_item,tables);
        tableSelector.setAdapter(adapter);
        tableSelector.setOnItemSelectedListener(new OnItemSelectedListener() 
        /* Some code containing some Log.d() */
        );
        /* Some code */
        Log.d("Insert fragment", "Setting table selected by position in list " + pos + ", " + tName);

        tableSelector.setSelection(pos); // pos is calculated correctly in the code i didn't show

        switch(spinnerFlag)
        
            case SPINNER_HIDDEN: tableSelector.setVisibility(View.GONE); break;
            case SPINNER_VISIBLE: tableSelector.setVisibility(View.VISIBLE); break;
            case SPINNER_VISIBLE_DISABLED: tableSelector.setVisibility(View.VISIBLE); 
                                              tableSelector.setEnabled(false); 
                                              break;
            default: Log.d("onActivityCreated - InserFragment", "Spinner flag < " + spinnerFlag + " > does not exist. Spinner is now visible enabled.");
        
    

tableSelector.setSelection(pos) 之前的Log 会显示在 LogCat 中,但不会显示来自 tableSelector.onItemSelected();Logs,因此 setSelection 不会调用它。 知道为什么会这样吗? (我在想将 aView 设置为 GONE 可能会停止它的功能,但我在将其设置为 GONE 之前setSelection()

谢谢!

已修复 而不是:

 tableSelector.setVisibility(View.GONE); break;

我使用了解决方法:

tableSelector.setVisibility(View.VISIBLE); 
tableSelector.setEnabled(false);
ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) tableSelector.getLayoutParams();
params.height = 0;
tableSelector.setLayoutParams(params);
break;

它现在可以按我的需要工作了。

【问题讨论】:

当视图设置为 GONE 时,它不会占用布局中的任何空间。你的 ListView 有这个 attr android:layout_below="@+id/tableSelector" 它将寻找 Spinner 在它下面设置 ListView。 【参考方案1】:

您需要将此行添加到您的列表视图android:layout_alignWithParentIfMissing="true"

<ListView
    android:id="@+id/insertList"
    android:layout_
    android:layout_
    android:layout_below="@+id/tableSelector"
    android:layout_above="@+id/saveButton"
    android:background="#aaffffff"
    android:divider="#11000000"
    android:dividerHeight="4dp"
    android:layout_alignWithParentIfMissing="true"
    android:visibility="gone" >

</ListView>

【讨论】:

请查看我的问题的更新版本。谢谢!【参考方案2】:

当视图设置为 GONE 时,它不会占用布局中的任何空间。你的ListView 有这个属性android:layout_below="@+id/tableSelector",它将寻找Spinner 以在它下面设置ListView

为避免这种情况,您可以简单地将行 android:layout_alignWithParentIfMissing="true" 添加到您的 ListView,这样它会在 Spinner 丢失时忽略查找,并且也会覆盖它的位置。希望对您有所帮助。

【讨论】:

请查看我的问题的更新版本。谢谢!

以上是关于android - 使视图“GONE”导致其下方的视图也不可见的主要内容,如果未能解决你的问题,请参考以下文章

如何从 View.gone 恢复视图。在xml中使用'android:visibility =“gone”'后setVisibility(View.VISIBLE)不起作用

最初隐藏的视图布局,然后 onclick 将使视图可见,反之亦然(Android)

Android set View.GONE 不会在列表视图中“释放”空间

iPhone - 我如何隐藏视图并让它的空间被其他视图使用(如 android visibility = GONE)

iPhone - 我如何隐藏视图并让它的空间被其他视图使用(如 android visibility = GONE)

如何在 ANDROID 中为 View.GONE 到 View.VISIBLE 的视图设置动画