当前位置: 首页 > 知识库问答 >
问题:

如何使用微调器处理奇怪的S笔错误?

况胡媚
2023-03-14

当使用具有所有默认设置的Spner时,我在使用S Pen时发现了一些奇怪的错误:

  1. 如果你打开旋转器并将S笔悬停在列表的底部,这样它就会滚动到底部,然后向上提起S笔(这样悬停圈就消失了),列表就会跳回到顶部
  2. 如果你打开旋转器,悬停在列表底部的S笔,所以它滚动到底部,然后选择一个选项,有时(间歇性-也许大约1/4次)它会忽略所选的选项,然后跳回来到顶部

我正在一台平板设备上进行横向测试,该设备运行的是Android9,但我在其他设备上做了一些测试,结果似乎是一样的。

作为比较,我试着使用一个我经常使用的应用程序,该应用程序大量使用微调器。该应用上次更新于2019年,目标SDK为27。通过进入设置并添加多个行李项目,然后尝试编辑任何装箱单项目上的行李,您可以轻松测试应用程序中的微调器。我发现S笔可以很好地使用这个应用程序,而且它没有上面描述的错误,所以一定有办法解决它。这不是一个开源的应用程序,所以我无法从他们的源代码中获得想法。我尝试将我的目标SDK更改为27,但没有任何区别。

这是我的代码,在我看来,它是一个带有所有默认设置的spinner的完全普通的实现,并且仍然有这些“S笔错误”,它们在装箱单中是不可复制的。

Androidanifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.penpoc">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.SPenControlExperiment">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

主要活动。爪哇:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.container, MainFragment.newInstance())
                    .commitNow();
        }
    }
}

主要活动。xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" />

Main Fragment.java:

public class MainFragment extends Fragment {

    public static MainFragment newInstance() {
        return new MainFragment();
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.main_fragment, container, false);

        Spinner spDefault = root.findViewById(R.id.spDefault);

        ArrayAdapter<String> defaultSpinnerAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item);
        defaultSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spDefault.setAdapter(defaultSpinnerAdapter);

        defaultSpinnerAdapter.addAll(getExampleList());
        defaultSpinnerAdapter.notifyDataSetChanged();

        return root;
    }

    private List<String> getExampleList() {
        List<String> list = new ArrayList<>();
        list.add("Alpha");
        list.add("Bravo");
        list.add("Charlie");
        list.add("Delta");
        list.add("Echo");
        list.add("Foxtrot");
        list.add("Golf");
        list.add("Hotel");
        list.add("India");
        list.add("Juliet");
        list.add("Kilo");
        list.add("Lima");
        list.add("Mike");
        list.add("November");
        list.add("Oscar");
        list.add("Papa");
        list.add("Quebec");
        list.add("Romeo");
        return list;
    }
}

主碎片。xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainFragment">

    <!-- Add some text views to push the spinner further down the page, this is not strictly necessary -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="one" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="two" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="three" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="four" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="five" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="six" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="seven" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="eight" />

    <Spinner
        android:layout_width="350dp"
        android:layout_height="wrap_content"
        android:id="@+id/spDefault" />

</LinearLayout>

格雷德尔副部长:

    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'com.google.android.material:material:1.3.0'

共有1个答案

宰父嘉胜
2023-03-14

我的钢笔也面临着同样的问题。对于一个旧的应用程序来说,API25Spinners工作得很好,但在API30上就不再如此了。我唯一能解决这个问题的方法是用AutoCompleteTextViews替换Spinners。它生成的下拉列表似乎可以正确使用s笔。

需要进行一些调整,使其看起来像一个微调器

从留档中,您可以通过添加android: inputType="no"来实现。但是,正如MaterialAutoCompleteTextView代码中所说:

// Due to a framework bug, setting android:inputType="none" on xml has no effect. Therefore,
// we check it here in case the autoCompleteTextView should be non-editable.

所以你有两个选择:

  • 以编程方式设置输入类型autoComplete。setInputType(InputType.TYPE\u NULL)
  • 使用MaterialAutoCompleteTextView解决此问题

AutoCompleteTextView的默认行为是通过键入几个字符来显示建议。因此,当视图聚焦时,您必须强制下拉显示。

autoComplete.setOnFocusChangeListener(new View.OnFocusChangeListener() {
  @Override
  void onFocusChange(View v, boolean hasFocus) {
    if (hasFocus) {
      autoComplete.showDropDown();
    }
  }
});

autoComplete.setOnDismissListener(new AutoCompleteTextView.OnDismissListener() {
  @Override
  void onDismiss() {
    // Force focus change after selection
    autoComplete.clearFocus()
  }
});

SpinnerAdapter调用getView()getDropDownView()相反,AutoCompleteTextView只调用getView()。因此,要提供正确的视图,您需要在getView()call中检查父类型:

@Override
public @NonNull View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
  // Workaround for AutoCompleteTextView using only this method
  if (parent instanceof ListView) {
    return getDropDownView(position, convertView, parent);
  } else {
    return super.getView(position, convertView, parent);
  }
}

最后一件事是在AutoCompleteTextView的末尾添加一个小插入符号,使其看起来像一个微调器。您可以在XML布局文件中使用android:drawableEnd属性来处理此问题。

  • AutoCompleteTextView下拉列表选择触发器AdapterView。OnItemClickListener而不是AdapterView。OnItemSelectedListener微调器一样。方法签名几乎相同
  • 没有合适的方法触发此侦听器获取初始值。作为一种解决方法,您可以设置初始值,然后附加侦听器并将第一个验证逻辑放入其构造函数中

 类似资料:
  • 问题内容: 我一直在使用PyCharm在PyQt中调试我的GUI。到目前为止,这确实非常成功,直到我在尝试调试gui时遇到一个奇怪的错误。我已经在脚本的开始以及各个点设置了一个断点,但是程序没有机会到达这一点。我也尝试删除所有断点并运行调试,但得到相同的结果。完整的回溯是: 有谁知道导致此错误的原因以及如何解决?当我正常运行代码(无需调试)时,不会遇到任何这些错误。 问题答案: 我遇到了同样的问题

  • 问题内容: 我正在使用此库(PHP简单HTML DOM解析器)来解析链接,这是代码: 但是在输出结果时出现此错误: 致命错误:在第25行的/var/www/vhosts/efamous.de/subdomains/sandbox/httpdocs/getNewTrusts.php中的非对象上调用成员函数find() (第25行是foreach循环),奇怪的是它(至少在表面上)正确地输出了所有内容,

  • 问题内容: 我正在使用此代码: 但是在编译时出现此错误: 然后是堆栈跟踪的编译器错误。 我将在课堂开始时同时进行这两种导入: 有什么事吗 在Netbeans中,我看到自动完成选项并且Locale对象没有语法错误… 问题答案: 您的设置有些麻烦,下面的程序对我来说很好用。 它要求源代码的事实使我相信它正在尝试以某种调试模式进行编译或运行。您不需要编译java.util。*的源代码,这很奇怪。 看看我

  • 问题内容: 假设我有以下jQuery AJAX调用: 现在,当进行此AJAX调用时,我希望服务器端代码通过一些错误处理检查来运行(例如,用户是否仍在登录,他们是否有权使用此调用,数据是否有效,等等)。如果检测到错误,如何将错误消息冒泡回客户端? 我最初的想法是返回一个带有两个字段的JSON对象:error和errorMessage。然后将在jQuery AJAX调用中检查以下字段: 这对我来说有点

  • 我从凯拉斯搬到了皮托克。我对搬到CUDA这件事很陌生。我花了好几个小时在网上冲浪,却什么都没找到?修复可能是一两行。如果有人知道如何解决这个问题,我会很感激的? 下面是我的代码,首先我将我的u-net模型定义为一个nn类。类似于以下代码的模块: 然后我像下面的代码一样运行我的unet。请注意,在定义模块时,我将其设置为cuda。我还将输入数据及其标签设置为cuda。 但是我得到了这个错误: Run

  • 要查看Busybox的版本,请使用以下代码 公共字符串busybox_v()引发IOException{ 在大多数手机中工作正常,但在Nexus4中,他们给我发送了这个日志 java.lang.StringIndexOutOfBoundsException:长度=0;regionStart=0;regionLength=15在java.lang.String.StartAndLength(Stri