Ben*_*fez 5 android android-appcompat android-actionbar
我已经实现了一个自定义操作栏布局AppCompat:
public class DoneBarActivity {
public interface OnSaveActionListener {
public void onSave();
}
public static void setupActionBar(final ActionBarActivity activity,
final OnSaveActionListener listener) {
// Inflate a "Done/Cancel" custom action bar view.
final LayoutInflater inflater = (LayoutInflater) activity
.getSupportActionBar().getThemedContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View customActionBarView = inflater.inflate(
R.layout.actionbar_custom_view_done_cancel, null);
customActionBarView.findViewById(R.id.actionbar_done)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// "Done" (or "Save")
if (listener != null) {
listener.onSave();
}
activity.finish();
}
});
customActionBarView.findViewById(R.id.actionbar_cancel)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// "Cancel"
activity.finish();
}
});
// Show the custom action bar view and
// hide the normal Home icon and title.
final ActionBar actionBar = activity.getSupportActionBar();
actionBar.setDisplayOptions(
ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_CUSTOM |
ActionBar.DISPLAY_SHOW_HOME |
ActionBar.DISPLAY_SHOW_TITLE);
actionBar.setCustomView(customActionBarView,
new ActionBar.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
);
}
}
Run Code Online (Sandbox Code Playgroud)
我的活动只是一个愚蠢的ActionBarActivity加载片段FrameLayout.这是片段代码:
@Override
public View onCreateView(final LayoutInflater inflater,
final ViewGroup container,
final Bundle savedInstanceState) {
// ...
DoneBarActivity.setupActionBar((ActionBarActivity) getActivity(),
new DoneBarActivity.OnSaveActionListener() {
@Override
public void onSave() {
saveIssueChangesAndClose();
}
});
return v;
}
Run Code Online (Sandbox Code Playgroud)
这是动作栏布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:divider="?attr/dividerVertical"
android:showDividers="middle"
android:dividerPadding="12dp">
<include layout="@layout/include_cancel_button"/>
<include layout="@layout/include_done_button"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
这是两个按钮:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="?actionButtonStyle"
android:id="@+id/actionbar_cancel"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<TextView
style="?actionBarTabTextStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingRight="20dp"
android:drawableLeft="@drawable/ic_action_cancel"
android:drawablePadding="8dp"
android:gravity="center_vertical"
android:text="@android:string/cancel"/>
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
和
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="?actionButtonStyle"
android:id="@+id/actionbar_done"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<TextView
style="?actionBarTabTextStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingRight="20dp"
android:drawableLeft="@drawable/ic_action_done"
android:drawablePadding="8dp"
android:gravity="center_vertical"
android:text="@string/save"/>
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
这是Jelly Bean vs. Gingerbread的结果(第一个是Galaxy Nexus,后者是模拟器):

抱歉质量,动画PNG无法正常工作所以我切换到动画GIF.
如您所见,内容布局将覆盖操作栏自定义布局(请注意JB中的蓝色溢出和滚动条位置).
使用非自定义操作栏布局在JB和GB上都能正常工作.
覆盖是由于不同版本的 Android 中用于引用内容视图的资源 id 不同而导致的。详细信息请参考Shellom的帖子。同时,以下代码片段应该可以帮助您识别代码的相关部分。
// http://code.google.com/p/android/issues/detail?id=58108
private static int getContentViewCompat() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH ?
android.R.id.content : R.id.action_bar_activity_content;
}
Run Code Online (Sandbox Code Playgroud)
更新:不再需要开关。您可以将appcompat-v7 更新到修订版 19.0.0。或更新版本,然后android.R.id.content在所有 Android 版本上参考。
| 归档时间: |
|
| 查看次数: |
3294 次 |
| 最近记录: |