appcompat 中使用 ActionBar 的自定义布局会导致内容与操作栏重叠

2024-03-15

我已经实现了自定义操作栏布局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
                              )
                             );
  }
}

我的活动只是一个愚蠢的活动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;
}

这是操作栏布局:

<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>

这是两个按钮:

<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>

and

<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>

这是 Jelly Bean 与 Gingerbread 的结果(第一个是 Galaxy Nexus,后者是模拟器):

抱歉,质量问题,动画 PNG 无法正常工作,所以我改用动画 GIF。

正如您所看到的,内容布局正在超越操作栏自定义布局(请注意 JB 和滚动条位置中的蓝色溢出)。

使用非自定义操作栏布局在 JB 和 GB 上都可以正常工作。


覆盖是由于不同版本的 Android 中用于引用内容视图的资源 id 不同而导致的。请参阅Shellom 的帖子了解详细信息 https://stackoverflow.com/a/17998802/356895。同时,以下代码片段应该可以帮助您识别代码的相关部分。

// 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;
}

Update:不再需要该开关。您可以更新appcompat-v7 至修订版 19.0.0。或更新的然后参考android.R.id.content在所有 Android 版本上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

appcompat 中使用 ActionBar 的自定义布局会导致内容与操作栏重叠 的相关文章

  • Android ListView 子项

    我最近为 Android 应用程序创建了一个新的 ListView 对象 但遇到了一些错误 当我尝试使用简单适配器创建一个包含列表中子项目的项目时 创建的最新项目与其他项目重叠 我正在使用地图列表来创建项目 例如 如果我向地图列表中添加一个
  • 是否可以在图片上叠加图标

    我正在创建一个允许用户上传图片的应用程序 当图片上传成功后 我想在右上角添加一个绿色的勾号 可绘制 失败时也一样 但有一个十字 Atm 我正在使用 Glide 在屏幕上显示 URI 我怎样才能做到这一点 您可以通过调用 glide 侦听器来
  • 带 html 表格的 TextView

    我有个问题 我想放入 TextView html 格式文本 我添加如下
  • Android - 尝试重新打开已关闭的对象:使用 loaderManager 的 SQLiteQuery

    我对 android 相当陌生 我对过滤后的 listView 和它从横向模式更改为纵向模式的活动有一些问题 反之亦然 我有一个用于过滤 drinkSearch 的 editText 只要我不更改视角 纵向与横向 此过滤就有效 这是我得到的
  • 如何在 Android 中动态添加新的 Android 芯片?

    我有一个名为 Question 的类 其中包含标签的字符串数组 我试图使用 Kotlin 显示 Recyclerview 中的每个问题以及新芯片中的每个标签 这些芯片将包含在一个 ChipGroup 中 我的问题是 如何将数组的每个标签元素
  • Eclipse Android 不会清理,不会刷新资源

    我升级到Ubuntu 11 10 Eclipse 3 7 0 ADT 14 0 0 当我替换桌面上 res drawable nodpi 目录中的图片资源或 res raw 目录中的声音资源时 重新编译的程序和 Project Explor
  • 如何获取与 TextView 关联的字符串资源的 id?

    我可以访问 TextView 实例 获取它的资源 ID 并通过以下方式获取它的资源名称getResources getResourceEntryName 但我似乎找不到一种方法来获取与其关联的字符串的 id 如何动态获取与 TextView
  • 不要保留活动 - 这样做的目的是什么?

    标题是非常不言自明的 我明白这个开发者选项的作用 What I 不明白有以下几点 首先为什么要引入这个选项 经过这些年来该框架经历了所有的变化 它仍然有用吗 我很想知道这个选择背后的原因 我相信这是一个用于调试目的的功能 来自钛文档 htt
  • Android mediacontroller 播放暂停控件无法正确刷新

    我在我的活动中使用了 MediaController 它工作正常 但是当我第一次播放视频时 应该有 b 可见的暂停按钮 但相反 有播放 当我按下该按钮时 视频会正确暂停 状态保持不变 之后它工作正常 视频完成时也会发生同样的事情 这是一个错
  • android 中的 lang.NumberFormatException

    我有以下代码 除了在后台线程中从数据库读取一些值并使用这些值之外什么也不做 我使用 jar 绘制折线图 对于我用于每个数组值的折线图 问题是第三个我传递给绘制 LineChart 的构造函数的参数是 float float viteza S
  • Android,在连接wifi的情况下与移动数据通信,无需上网

    我有一个汽车配套应用程序 需要与 WiFi 和移动数据网络进行通信 我的车辆控制单元提供了一个无需互联网访问的 WiFi 网络 它公开了我们可以从应用程序调用的 API 服务 除此之外 我们还需要使用手机移动数据 3G 4G 与另一个可通过
  • 在选择项目之前设置微调器的文本

    我有一个包含三个项目的微调器 我使用 XML 字符串数组资源来为其提供数据 当您打开活动时 微调器通常会显示数组列表中的第一项 我想更改它并在选择项目之前在微调器中显示文本 选择一个 我怎样才能做到这一点 您可以通过以下两种方式之一进行操作
  • RecyclerView:禁用焦点变化引起的滚动

    TL DR我有一个RecyclerView of EditTexts 当用户注意力集中时EditText 1并点击EditText 2 我想EditText 2获得焦点 但我不想要ReyclerView滚动 我怎样才能实现这个目标 我正在尝
  • 多次调用 startService 时实际会发生什么

    我正在打电话startService 多次对同一服务有不同的意图 很明显 任何时候都只存在一个服务实例startCommand 被称为每个startService 我的问题是 调用时有性能影响吗startService 多次 意图会按照调用
  • 如何在Android AsyncTask中显示Toast?

    我正在尝试在我的initial background类中显示Toast 扩展为AsyncTask
  • Android:在 Android M 中完全禁用 deviceidle(“Doze”)?

    在已 root 的 Android M 设备中 我想始终完全禁用设备空闲模式 Doze 是的 我知道这会影响我的电池寿命 这对我来说没问题 我知道我可以调用以下内容 dumpsys deviceidle disable 但是 我无法找到该子
  • sqlite3权限被拒绝android

    我试图直接在 Nexus 上访问我正在开发的应用程序的数据库 但当我尝试执行 sqlite3 命令时 我收到 权限被拒绝 的消息 我还尝试在 root mod 中启动 adb 但再次 设备上的权限被拒绝 我想我必须使用模拟器来做到这一点 但
  • 如何将数据从普通 Android 应用程序传递到 Google glass 应用程序,反之亦然?

    我不知道 GoogleGlass 只是搜索它 我已经检查了下面的链接 但我认为下面的链接已被弃用 我无法找到传递数据的方法 我已经搜索了 4 天以上 但无法找到传递数据的方法 想要为谷歌眼镜创建应用程序 https stackoverflo
  • 为什么在 this 方法中添加 If 语句会大大降低速度?

    我在中遇到过这个回答另一个问题 https stackoverflow com questions 12233594 faster way to apply alpha to a jpeg in an android app 我试图诊断哪些
  • Google Analytics 数据中出现未知的应用版本

    我有一个Android应用程序发布到Google Play商店 它的apk文件也被我不认识的人发布到一些中国商店 今天我注意到Google Analytics数据中一个非常奇怪的情况 我从未发布过1 6 3版本 但我注意到它在那里 有37个

随机推荐