如何建立一个浮动可触摸的活动,仍然允许接触它的边界之外的本地控制?

问题描述 投票:6回答:2

我想实现最好是通过我与MSPAINT做出的方案解释:

enter image description here

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

如果我设置FLAG_NOT_FOCUSABLE那当然活动下的本地控制是可触摸的,但随后其边界内触摸时的活动完全是后话。

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

任何人都可以做到这一点?我真的很感激小演示的活动,以这种方式工作,所以我可以把它和工作从那里。我已经尝试了窗口管理器和意图的标志,并没有什么似乎正是我需要工作,无数的排列。

提前致谢。

更新:

我曾尝试你的建议,但它仍然是需要的没有工作。

这是我的活动布局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);
}

不幸的是,这是结果:

Does not look like a dialog

我在想什么?

谢谢。

android android-activity floating
2个回答
9
投票

在你的清单中Dialog设置一个Activity主题。例如:

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

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

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

0
投票

您可以使用活动与您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>

也不要忘记设置mach_parent属性的活动,如:

override fun onStart() {
        super.onStart()
        window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
    }
© www.soinside.com 2019 - 2024. All rights reserved.