【问题标题】:How to hide spinner dropdown android如何隐藏微调器下拉android
【发布时间】:2015-04-22 18:12:16
【问题描述】:

我想在外部点击时隐藏微调器提示弹出窗口。如果提示弹出窗口打开并且用户按下主页键活动将最小化,因此当用户再次打开应用程序时,提示弹出窗口应该消失。
有什么办法可以做到这一点。 谢谢你

编辑:-- 提示弹出未自定义。所以我不能将它们隐藏在onPauseonResume 方法中。

【问题讨论】:

  • 盲目猜测(所以它不能作为答案):不会从onResume() 的这个观点中解决问题吗?
  • 你需要使用 onStart() 或 onResume() 方法。

标签: android spinner android-spinner


【解决方案1】:

嗯,它比我想象的要复杂一些。

我在这里添加分步详细信息。尝试跟随它。我能够在 api 级别 10 中实现这一点。

并且此解决方案假定您应该在用户单击主页按钮时以编程方式关闭提示对话框,或者如果您必须在没有用户交互的情况下移动到下一个活动

第一步是通过扩展 Spinner 类来创建自定义 Spinner。 假设我在 com.bts.sampleapp

包中创建了一个名为 CustomSpinner 的类

我的 CustomSpinner 类看起来像这样,

package com.bts.sampleapp;

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

    public class CustomSpinner extends Spinner{
        Context context=null;

        public CustomSpinner(Context context) {
            super(context);
            this.context=context;
        }

        public CustomSpinner(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }

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

        @Override
        public void onDetachedFromWindow() {
            super.onDetachedFromWindow();
        }
    }

现在在您的 Xml 文件中,将 Spinner 元素替换为此自定义微调器,

        <com.bts.sampleapp.CustomSpinner
        android:id="@+id/spin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

下一步是在你的 Activity 类中初始化和设置适配器到这个微调器,

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    CustomSpinner spin=null;
    spin=(CustomSpinner)findViewById(R.id.spin);
    spin.setAdapter(spinnerAdapter); //you can set your adapter here.
}

最后一步是在用户单击 HomeButton 或 Activity 移至后台时关闭对话框。为此,我们像这样覆盖 onPause(),

@Override
    protected void onPause() {
        Log.i("Life Cycle", "onPause");
        spin.onDetachedFromWindow();
        super.onPause();
    }

现在在 onPause() 中调用 spin.onDetachedFromWindow(); 方法,它会为您关闭提示对话框。

如果 Spinner 提示对话框已打开,则从 Acitivity 中的任何位置调用 spin.onDetachedFromWindow(); 也会关闭它。

【讨论】:

  • 它成功了...还有一件事我们可以在 spinner 中选择相同的项目两次。我认为我们需要为此修改 customspinner 类?
  • 你的意思是多选?我不知道。我还没有尝试过。对不起..
  • 不是多选假设你的微调器有 5 个项目你选择了第 2 项然后再次如果你选择第 2 项微调器将不会触发 onItemSelection 方法
  • 谢谢。这是我发现唯一有效的方法。我正在使用语音界面来选择微调器项目,并且需要在说出的单词与列表中的项目匹配时关闭它。
  • 如何检测微调器弹出窗口是否被解除(通过项目选择或在弹出窗口之外的触摸)...???
【解决方案2】:

根据 Andro 的回答,您可能更喜欢反射来调用受保护的方法 onDetachedFromWindow。然后你就不必继承 Spinner、调整布局等。

/**
 * Hides a spinner's drop down.
 */
public static void hideSpinnerDropDown(Spinner spinner) {
    try {
        Method method = Spinner.class.getDeclaredMethod("onDetachedFromWindow");
        method.setAccessible(true);
        method.invoke(spinner);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

【讨论】:

    【解决方案3】:
    • 您可以弹出 Activity 作为对话框主题。
    • 覆盖onPause 方法。

      受保护的 void onPause (){ 超级.onPause(); this.finish(); }

    【讨论】:

      【解决方案4】:

      微调器.clearFocus();

      这是以编程方式关闭微调器的简单行

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-19
        • 1970-01-01
        • 1970-01-01
        • 2015-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多