ActionBar DropDown 填充导致空白 space [横向模式]
ActionBar DropDown padding causes blank space [landscape mode]
目前我有以下style.xml
已更新 - 包括所有相关样式
<style name="AppTheme" parent="Theme.AppCompat.Light">
<item name="actionBarStyle">@style/MyActionBarStyle</item>
<item name="actionDropDownStyle">@style/MyDropDownStyle</item>
</style>
<style name="MyActionBarStyle" parent="Widget.AppCompat.ActionBar.Solid">
<item name="android:actionBarDivider">@null</item>
<item name="background">@drawable/logo</item>
<item name="displayOptions">showHome</item>
</style>
<style name="MyDropDownStyle" parent="Base.Widget.AppCompat.Spinner.DropDown.ActionBar">
<item name="android:paddingLeft">240dp</item>
<item name="android:dropDownHorizontalOffset">240dp</item>
<item name="android:background">@android:color/transparent</item>
</style>
这让我可以将 DropDown 设置为远离其 X 轴 240dp,效果非常好。请参阅屏幕截图 #1
截图#1
但作为副作用,此填充会导致弹出窗口本身的右侧出现空白 "space"。请参见屏幕截图 #2
截图#2
如何设置 Popup 的固定大小或忽略 DropDown 样式设置的填充?
已更新
paddingLeft 的原因是不与徽标重叠(定义为背景)
<item name="background">@drawable/logo</item>
更新 2 - 没有 dropDownHorizontalOffset 样式的屏幕截图
PS:
dropDownHorizontalOffset
只是用来设置Popup匹配的X轴匹配paddingLeft
一个可能的解决方法是用新工具栏 (android.support.v7.widget.Toolbar) 替换 ActionBar 并在其中添加一个微调器 (DropDown)
代码行已更改以便更好地说明并且未经过测试
main_activity.xml
<LinearLayout
android:orientation="vertical"
android:background="@color/navigationBar"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<android.support.v7.widget.Toolbar
android:background="@drawable/logo"
android:id="@+id/toolbar"
android:layout_height="wrap_content"
android:layout_width="match_parent">
<Spinner
android:layout_marginLeft="240dp"
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</android.support.v7.widget.Toolbar>
</LinearLayout>
MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//toolbar.setLogo(R.drawable.logo);
setupSpinnerTabs();
// for device orientation purpose
displaySpinner(getResources().getConfiguration().orientation);
}
private void setupSpinnerTabs() {
ToolbarSpinnerAdapter adapter = new ToolbarSpinnerAdapter(toolbar.getContext());
spinner = (Spinner)findViewById(R.id.spinner);
spinner.setAdapter(adapter);
// the below is used for the selection "change event" of the spinner
//spinner.setOnItemSelectedListener(new SpinnerSelection());
}
ToolbarSpinnerAdapter.java
public class ToolbarSpinnerAdapter extends BaseAdapter implements SpinnerAdapter {
Context context;
ToolbarSpinnerAdapter(Context ctx) {
context = ctx;
}
@Override
public int getCount() {
return 1;
}
@Override
public Object getItem(int position) {
return "Spinner here"
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View defaultView = getLayoutInflater().inflate(R.layout.your_spinner_dropdown_layout, null);
// [...]
text.setText( this.getItem(position).toString() );
return defaultView;
}
}
结果应该与下图非常相似:
PS:在纵向模式下,可能没有足够的 space 用于 Spinner
目前我有以下style.xml
已更新 - 包括所有相关样式
<style name="AppTheme" parent="Theme.AppCompat.Light">
<item name="actionBarStyle">@style/MyActionBarStyle</item>
<item name="actionDropDownStyle">@style/MyDropDownStyle</item>
</style>
<style name="MyActionBarStyle" parent="Widget.AppCompat.ActionBar.Solid">
<item name="android:actionBarDivider">@null</item>
<item name="background">@drawable/logo</item>
<item name="displayOptions">showHome</item>
</style>
<style name="MyDropDownStyle" parent="Base.Widget.AppCompat.Spinner.DropDown.ActionBar">
<item name="android:paddingLeft">240dp</item>
<item name="android:dropDownHorizontalOffset">240dp</item>
<item name="android:background">@android:color/transparent</item>
</style>
这让我可以将 DropDown 设置为远离其 X 轴 240dp,效果非常好。请参阅屏幕截图 #1
截图#1
但作为副作用,此填充会导致弹出窗口本身的右侧出现空白 "space"。请参见屏幕截图 #2
截图#2
如何设置 Popup 的固定大小或忽略 DropDown 样式设置的填充?
已更新
paddingLeft 的原因是不与徽标重叠(定义为背景)
<item name="background">@drawable/logo</item>
更新 2 - 没有 dropDownHorizontalOffset 样式的屏幕截图
PS:
dropDownHorizontalOffset
只是用来设置Popup匹配的X轴匹配paddingLeft
一个可能的解决方法是用新工具栏 (android.support.v7.widget.Toolbar) 替换 ActionBar 并在其中添加一个微调器 (DropDown)
代码行已更改以便更好地说明并且未经过测试
main_activity.xml
<LinearLayout
android:orientation="vertical"
android:background="@color/navigationBar"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<android.support.v7.widget.Toolbar
android:background="@drawable/logo"
android:id="@+id/toolbar"
android:layout_height="wrap_content"
android:layout_width="match_parent">
<Spinner
android:layout_marginLeft="240dp"
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</android.support.v7.widget.Toolbar>
</LinearLayout>
MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//toolbar.setLogo(R.drawable.logo);
setupSpinnerTabs();
// for device orientation purpose
displaySpinner(getResources().getConfiguration().orientation);
}
private void setupSpinnerTabs() {
ToolbarSpinnerAdapter adapter = new ToolbarSpinnerAdapter(toolbar.getContext());
spinner = (Spinner)findViewById(R.id.spinner);
spinner.setAdapter(adapter);
// the below is used for the selection "change event" of the spinner
//spinner.setOnItemSelectedListener(new SpinnerSelection());
}
ToolbarSpinnerAdapter.java
public class ToolbarSpinnerAdapter extends BaseAdapter implements SpinnerAdapter {
Context context;
ToolbarSpinnerAdapter(Context ctx) {
context = ctx;
}
@Override
public int getCount() {
return 1;
}
@Override
public Object getItem(int position) {
return "Spinner here"
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View defaultView = getLayoutInflater().inflate(R.layout.your_spinner_dropdown_layout, null);
// [...]
text.setText( this.getItem(position).toString() );
return defaultView;
}
}
结果应该与下图非常相似:
PS:在纵向模式下,可能没有足够的 space 用于 Spinner