【问题标题】:Set device wallpaper to be the background for an activity layout将设备壁纸设置为活动布局的背景
【发布时间】:2017-11-24 20:10:22
【问题描述】:

我似乎不明白我的代码有什么问题,用于将设备壁纸设置为启动器活动布局的背景。我试图在网上搜索更好的代码,但到目前为止我得到的是这个导致错误的代码:


WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
Drawable wallpaperDrawable = wallpaperManager.getDrawable();

MyLogin = (RelativeLayout) findViewById(R.id.login);
MyLogin.setBackground(wallpaperDrawable);

感谢您对此问题的帮助和关注

【问题讨论】:

  • 介意告诉我们您遇到了哪个错误吗?可能在您的问题中包含 logcat
  • 试试这个MyLogin.setBackgroundDrawable(wallpaperDrawable);
  • 顺便说一句,您发布的这段代码也有效。
  • 感谢@Psy Duck 的灵魂。它就像一个魅力
  • 很高兴它对您有所帮助。 :) 通过单击前面的勾号来选择我的答案。 :)

标签: android eclipse


【解决方案1】:

最好的办法是让系统为你显示壁纸背景。 有FLAG_SHOW_WALLPAPERwindowShowWallpaper 属性。

更多示例可以在这里找到:

【讨论】:

  • 这个要点对我有用,做了一些调整(请参阅我留下的评论)。其他方法给出了不同的图像,而不是我的实际壁纸。
【解决方案2】:

试试这个。它肯定会起作用

        WallpaperManager wallpaperManager = WallpaperManager.getInstance(this); 
        final Drawable wallpaperDrawable = wallpaperManager.getDrawable();
        MyLogin.post(new Runnable() {

            @Override
            public void run() {
                MyLogin.setBackground(wallpaperDrawable);
            }
        });

确实应该使用 ActionBar 的后代。此外,您可以选择稍后隐藏操作栏。像这样

<style name="Theme.AppCompat.Light.NoActionBar" parent="@style/Theme.AppCompat.Light">
    <item name="android:windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="android:windowContentOverlay">@null</item>
</style>

【讨论】:

  • 您可以像这样将样式设置为活动 android:theme="@style/Theme.AppCompat.Light.NoActionBar"
  • 感谢您的解决方案,请参阅下面对我有用的解决方案
  • 这可行,但它显示的是手机附带的一些默认壁纸,而不是我的实际壁纸。
【解决方案3】:

您还可以使用样式将设备壁纸用作活动背景。 使用

<activity android:theme="@android:style/Theme.Wallpaper.NoTitleBar">

<activity android:theme="@android:style/Theme.Holo.Wallpaper.NoTitleBar">

就您的代码而言,由于您没有指定您遇到的错误,很可能是您的活动布局中没有RelativeLayout id login xml

【讨论】:

  • 知道了:Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
  • 等等,我在实现你建议的主题时遇到了这个异常。
  • @PsyDuck AFAIK Theme.AppCompat 没有 Wallpaper 样式,因此无法使用样式。但我成功地使用 OP 代码将壁纸设置为背景。
  • 感谢您的解决方案,请参阅下面对我有用的解决方案
【解决方案4】:

你可以通过两种方式做到这一点......

  1. 转到该相对布局并在 &lt;RelativeLayout &gt; 中输入 android:background="@drawable/yourImage" 为 ex

  2. 以编程方式提供背景,例如 MyLogin = (RelativeLayout) findViewById(R.id.login); Mylogin.setBackgroundResource(R.drawable.YOUR_IMAGE);

【讨论】:

  • 感谢您的解决方案,请参阅下面对我有用的解决方案
【解决方案5】:

这就是最终对我有用的东西

@SuppressLint("NewApi") @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.home);

    gridView = (GridView) findViewById(R.id.gridView1);

    WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
    Drawable wallpaperDrawable = wallpaperManager.getDrawable();

    MyLogin = (RelativeLayout) findViewById(R.id.login);
    MySong.setBackgroundDrawable(wallpaperDrawable);
    }

错误是当我运行应用程序时它只是说应用程序 MyLogin com.example.login 已意外停止。请重试。

但是在我将 setBackground 更改为 setBackgroundDrawable 之后,它现在可以工作了。

【讨论】:

  • 我认为这只适用于普通壁纸,不是吗?不会显示动态壁纸,对吧?
【解决方案6】:

你可以试试

  MyLogin.setBackgroundDrawable(wallpaperDrawable);

而不是

MyLogin.setBackground(wallpaperDrawable);

虽然两者都可以根据设备工作。

【讨论】:

  • 这仅适用于普通壁纸,不是吗?不会显示动态壁纸,对吧?
  • 动态壁纸基本上是一个视频或 gif 文件。所以,它不会因为 WallpaperManager 获取一个 Drawable,所以它最多可以从中获取一个框架,我也必须进行测试。
  • 动态壁纸不是视频或 gif 文件。这是一个完整的应用程序。它可以展示它想要的东西,甚至可以与用户互动。
  • 您的具体要求是什么?
  • 不仅如此,我认为它需要READ_EXTERNAL_STORAGE权限,否则会崩溃。由于没有记录,我在这里写了:issuetracker.google.com/issues/110507691
猜你喜欢
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
相关资源
最近更新 更多