【问题标题】:Android webview dropdown menu does not work on Android 4.x devicesAndroid webview 下拉菜单不适用于 Android 4.x 设备
【发布时间】:2012-11-19 13:52:37
【问题描述】:

我的一个WebView 在 Android 4.x 设备上遇到问题。

Android 应用有一个 Tabhost,其中包含 Fragments。其中一个片段包含一个 webview。显示的页面有一个这样的下拉菜单:

<select id="mySelect" name="mySelect">
    <option value="1">Testname 1</option>
    <option value="2">Testname 2</option>
    <option value="3">Testname 3</option>
</select>

现在,当我使用装有 Android 4.1.1 的 Galaxy S3(或我可以使用的任何其他 Android 设备)打开我的应用程序时,我可以选择“Testname 1”,然后选择“Testname 2”等等。

在 Galaxy Nexus(在运行 Android 4.1.1、4.1.2 和 4.2 的不同设备上得到确认)上,当我尝试选择 UI 刚刚阻止的内容时。在我切换到另一个选项卡并突然返回 webview 选项卡后,UI 最终更改为先前选择的项目。

知道是什么原因造成的,或者我可以如何为 Galaxy Nexus 解决这个问题?

重要更新: 我可以追踪到Tabhost。当webviewtabhost 中时它不起作用,当它不在时它起作用。这可能与this issue 有关。

【问题讨论】:

  • 似乎不相关,因为我的最小示例仅包含上面的代码(+&lt;html&gt;&lt;body&gt; 等等),根本没有 jquery
  • 不确定这是否会有所作为,但也许值得一试,使用 @+id/mySelect 作为 id
  • @Tim 你找到解决方案了吗?
  • @Raanan 目前没有解决方案,除了更换 TabHost :(

标签: android android-fragments android-webview android-tabhost


【解决方案1】:

实际上,与仅使用 TabHost 相比,您可以使用 ActionBar 做更多的事情。包括标签。 link 将允许您在旧版本 minSdk = 4 中实现 ActionBar。与我合作过的大多数用户体验开发人员都认为选项卡有点过时,尽管它确实为用户提供了熟悉的 UI,但我是谁逆风吹? ActionBar 为 UI 提供了非常特定于 Android 的外观和干净的感觉。 link 是关于 Google 在该会议上推荐的 UI 模式的文档。 link 是讨论会议 UI 模式的 YouTube 视频。遵循这些建议可以更好地审查您的应用程序和更复杂的 UI 外观。我不确定您的需求是什么,但是如果您要做某事,不妨做对吗?如果您需要更多帮助,请告诉我。我可以为您提供有关使用 ActionBar 的示例。 ActionBar link 可以给你一些更好的理由,我可以告诉你为什么它是 UI 的好选择。

您是否正确实施了片段? link 是有关使用它们的文档。如果您使用动态片段而不是在布局中实现的固定片段,我在跨应用程序编写时发现的一个技巧是调用 .clearBackStack();当我遇到有趣的问题时,它似乎可以解决很多问题。

【讨论】:

  • 嗨,肖恩,该链接无法让我在以前的 Android 版本中使用 ActionBar,例如,请参阅 ActionBarSherlock。但是,您的 another 回答说我应该改用 ActionBar 仍然不能解决手头的问题。而且我已经说过我不能使用它,因为我无法实现我必须用它实现的东西(是的,我已经阅读了文档,不,我现在无法详细说明)。现在我可以在没有 TabHost 的情况下手动实现所有内容(确实 工作),问题仍然是,为什么它不能与 TabHost 一起工作?
【解决方案2】:

在 ICS 中的 TabHost?你在使用兼容包吗?如果您基本上在 3.1+ 中工作,则正确的设计是使用 ActionBar 来实现选项卡。

【讨论】:

  • 仍然有理由使用TabHost 而不是ActionBar,一个是与Android 2.3 兼容,另一个是例如我不能用ActionBar 做所有我可以用TabHost 做的事情。
  • use this for any extra issues with the ActionBar 过去对我有帮助,您可以导入库并查看代码。如果您更具体,我可能会为您发布一个示例。在您在问题中发布的链接中,文章底部有一个解决方法。让我知道我能做些什么来提供帮助。 link 是带有 Sherlock 库的片段示例的链接。如果您遇到困难,请认真告诉我。
【解决方案3】:

尝试在您的 XML 布局中使用这个自定义类而不是普通的 TabHost:

package com.example.test;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TabHost;

public class TabHostFix extends TabHost
{
    public TabHostFix(Context context)
    {
        super(context);
    }

    public TabHostFix(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    @Override
    public void onTouchModeChanged(boolean isInTouchMode)
    {
        //do not call through to base class, do nothing
        //this is a fix for tabhost stealing focus from textboxes
    }
}

在您的 XML 布局中引用自定义类,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<com.example.test.TabHostFix xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TabWidget
            android:id="@android:id/tabs"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:layout_weight="0"/>
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0" />
        <FrameLayout
            android:id="@+android:id/realtabcontent"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
    </LinearLayout>
</com.example.test.TabHostFix>

编辑: 作为替代解决方案,您可以使用支持库中的 ViewPager 和模拟选项卡的自定义 View Pager 指示器完全替换 TabHost。我以前从未尝试过,但我读到有很好的免费 3rd 方视图寻呼机指示器 here

【讨论】:

  • 另外,我同意使用 ActionBar 选项卡是理想的——但在少数情况下 TabHost 更灵活,例如,如果您想强制堆叠选项卡,无论设备/方向如何,等等。如果您不使用 ActionBar 选项卡的唯一原因是因为向后兼容,那么我强烈推荐 ActionBarSherlock 库。它易于使用,不需要太多时间来设置。
  • 我试过这个,但它不起作用(仍然和以前一样):(
  • 非常有趣...我刚刚使用运行 4.1 的模拟器进行了测试,并且可以确认与您相同的结果。我在上面发布的代码修复了 tabhost 窃取文本框的焦点,但没有纠正 web 视图中下拉菜单的奇怪行为。
【解决方案4】:

选择后,列表项数据可能会发生变化,但我们看不到变化。为此,我们需要显式刷新选择组件。希望这可以解决问题。

$("select#HeightUnit option[value='cm']").attr("selected", "selected"); $('select').selectmenu('refresh');

【讨论】:

  • 你能给我更多的背景信息,这应该如何解决问题,而不是让我的 UI 阻塞了?
  • Html 刷新是最重要的一项。当像以前一样给选择时。值将被设置。当我们点击它时,Webview 使它作为下拉菜单打开。但是当我们更改值时,值将被更改,但在 webview 中它可能不会刷新。因此,我们需要显式刷新/转到另一个选项卡,然后进入 webview 选项卡会以任何方式刷新屏幕。在你的情况下 $('#select#mySelect').attr('selected','selected'); $('选择').selectmenu('刷新');。将在 web 视图中单独刷新该选择组件
  • 所以,这可能会刷新选择菜单,对吧?但是:整个 UI 仍然会被阻止。我仍然无法选择其他任何东西,其他 UI 元素等等。
  • 您能否使用 weinre 运行该应用程序并检查是否存在任何其他 javascript 错误。
  • 什么 Javascript 错误?我的意思是,上面的代码几乎是所有的。没有运行 Javascript。
【解决方案5】:
> i think u must add the API version on your activity cause some UI cannot compatible on >android API 8. so check the API SDK like this.

>@TargetApi(Build.VERSION_CODES.GINGERBREAD)
>if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD)
>{
>// condisition
>}

【讨论】:

    猜你喜欢
    • 2021-06-20
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多