android - 制作 View "GONE"会导致其下方的 View 也不可见

标签 android listview spinner android-relativelayout visibility

我是 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_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Spinner
        android:id="@+id/tableSelector"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


    <ListView
        android:id="@+id/insertList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        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_width="wrap_content"
        android:layout_height="wrap_content"
        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 中,但是没有来自 Logs tableSelector.onItemSelected(); 已显示,因此 setSelection 不会调用它。 知道为什么会这样吗? (我在想将 View 设置为 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;

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

最佳答案

您需要将此行添加到 ListView android:layout_alignWithParentIfMissing="true"

<ListView
    android:id="@+id/insertList"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    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>

关于android - 制作 View "GONE"会导致其下方的 View 也不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27831681/

相关文章:

c# - 如何在 xamarin 表单中为 ListView 的每个项目提供不同的文本颜色

java - Android ListView-为每个项目打开新 Activity

java - 如何获取 GMT + 2 的时间并将其放入微调器中的 24 小时内项目中(仅限小时和分钟)?

java - 在外部类中使用微调器,因为所有其他 Activity 都需要

android - 如何连接到 Android 上的代理?

android - 如何将 ".apk"下载为 ".apk"? (不是 ".zip")

android - 访问共享首选项存储库中的 appcontext(架构)

android - Logcat 错误 : "addView(View, LayoutParams) is not supported in AdapterView" in a ListView

c# - ListView中的自定义ListViewItem

Android Spinner OnItemSelected 仅在用户交互时