android - 使视图 "GONE" 导致其下方的视图也不可见
android - Making a view "GONE" results in the view below it to be invisible as well
我是 android 的新手,我正在开发一个应用程序几个星期。
正如标题所说,我遇到的问题是当我想以编程方式将 Spinner
设置为 GONE 时,它下面的 RelativeLayout
中的 ListView
也是走了。
这里是 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_VISIBLE
和 SPINNER_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
的none ,所以 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;
它现在可以正常工作了。
您需要将此行添加到您的列表视图中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>
当视图设置为 GONE 时,它不会在布局中占用任何 space。您的 ListView
具有此属性 android:layout_below="@+id/tableSelector"
,它将查找 Spinner
以在其下方设置 ListView
。
为避免这种情况,您只需将 android:layout_alignWithParentIfMissing="true"
行添加到您的 ListView
,这样它就会在缺少 Spinner 时忽略寻找它,并且也会覆盖它的位置。希望对你有帮助。
我是 android 的新手,我正在开发一个应用程序几个星期。
正如标题所说,我遇到的问题是当我想以编程方式将 Spinner
设置为 GONE 时,它下面的 RelativeLayout
中的 ListView
也是走了。
这里是 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_VISIBLE
和 SPINNER_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
的none ,所以 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;
它现在可以正常工作了。
您需要将此行添加到您的列表视图中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>
当视图设置为 GONE 时,它不会在布局中占用任何 space。您的 ListView
具有此属性 android:layout_below="@+id/tableSelector"
,它将查找 Spinner
以在其下方设置 ListView
。
为避免这种情况,您只需将 android:layout_alignWithParentIfMissing="true"
行添加到您的 ListView
,这样它就会在缺少 Spinner 时忽略寻找它,并且也会覆盖它的位置。希望对你有帮助。