【问题标题】:How to create a floating touchable activity that still allows to touch native controls outside of its borders?如何创建一个仍然允许触摸其边界之外的本机控件的浮动可触摸活动?
【发布时间】:2015-11-22 09:24:11
【问题描述】:

我用 mspaint 制定的方案最好地解释了我想要实现的目标:

我试图设置FLAG_NOT_TOUCH_MODAL,根据描述应该正是我想要的,但它根本不起作用。我的活动消耗ALL触摸事件,甚至在其边界之外。

如果我设置FLAG_NOT_FOCUSABLE,那么当然活动下的本机控件是可触摸的,但是即使在其边界内触摸,活动也是完全不可触摸的。

我尝试在清单中设置isFloatingWindow=true,但似乎没有任何区别。

谁能做到这一点?我真的很感激一个以这种方式工作的小型演示活动,这样我就可以接受它并从那里开始工作。我已经为 WindowManager 和 Intent 标志尝试了许多排列,但似乎没有什么能完全按照我的需要工作。

提前致谢。

更新:

我已经尝试过您的建议,但仍然没有达到预期效果。

这是我的活动布局 xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="385dp"
android:layout_height="300dp"
android:theme="@android:style/Theme.Dialog"
tools:context="com.ui.activities.TestActivity"
android:id="@+id/testLayout"
android:visibility="visible"
android:background="@drawable/abc_ab_solid_light_holo"
android:clickable="true">

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click me"
    android:id="@+id/button"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="35dp"
    android:clickable="true"
    android:enabled="true"
    android:onClick="onClick" />

这是Activity 类:

public class TestActivity extends Activity implements View.OnClickListener {

private String TAG = TestActivity.class.getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);

    setWindowParams();
}

private void setWindowParams() {
    WindowManager.LayoutParams wlp = getWindow().getAttributes();
    wlp.dimAmount = 0;
    wlp.flags = WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS |
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
    getWindow().setAttributes(wlp);
}

不幸的是,结果如下:

我错过了什么?

谢谢。

【问题讨论】:

    标签: android android-activity floating


    【解决方案1】:

    在清单中的 Activity 上设置 Dialog 主题。例如:

    android:theme="@android:style/Theme.Dialog"
    

    然后在onCreate()中设置如下Window参数:

    public void setWindowParams() {
        WindowManager.LayoutParams wlp = getWindow().getAttributes();
        wlp.dimAmount = 0;            
        wlp.flags = WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS |
                    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
        getWindow().setAttributes(wlp);     
    }
    

    【讨论】:

    • 非常感谢您的回复!我一定会尝试第一次有机会回来报告。
    • android:theme="@android:style/Theme.Dialog" 进入清单中的 &lt;activity&gt; 标记,而不是布局中。
    • 诚实的错误 =] 定义在任何地方看起来都一样,并且在我设置它时也没有警告/错误。谢谢,现在它似乎工作得很好!
    • 是的,视图的初始化方式,任何不属于它们的东西都会被忽略,所以它不会因此崩溃。如果自定义 XML 命名空间和属性成为可能,那么您的 IDE 还不够聪明,无法知道那不存在。凉爽的。真高兴你做到了。干杯!
    • 哦,我刚刚意识到,您可能不需要FLAG_LAYOUT_NO_LIMITS,除非您希望您的活动能够扩展到屏幕外。我从我的一个项目中复制了该代码,并忽略了删除该标志。不过,如果你离开它,它不会造成任何伤害。
    【解决方案2】:

    您可以在 AndroidManifest 文件中使用具有特殊主题的活动:

    <style name="Theme.Transparent">
            <item name="windowActionBar">false</item>
            <item name="windowNoTitle">true</item>
            <item name="android:windowIsTranslucent">true</item>
            <item name="android:windowBackground">@android:color/transparent</item>
            <item name="android:colorBackgroundCacheHint">@null</item>
            <item name="android:windowContentOverlay">@null</item>
            <!--<item name="android:backgroundDimEnabled">false</item>--> // show/hide background 
            <item name="android:windowIsFloating">true</item>
    </style>
    

    并且不要忘记在 Activity 中设置 mach_parent 属性,例如:

    override fun onStart() {
            super.onStart()
            window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多