从应用程序内永久添加按钮

Posted

技术标签:

【中文标题】从应用程序内永久添加按钮【英文标题】:Add button permanently from within app 【发布时间】:2015-04-13 19:33:51 【问题描述】:

我希望我的应用程序提供添加按钮的功能,如 Avadhani Y 在How to create Button Dynamically in android? 中描述的那样

我复制了这段代码,当我按下 + 符号时会出现该按钮,但它不是永久性的。当我关闭应用程序并再次打开它时,按钮消失了。

对于一个最小的工作示例,我

创建了一个由 Eclipse 设置的空白 Android 应用程序项目

将How to create Button Dynamically in android? 中描述的部分方法添加到 MainActivity.java (第二种情况带有减号按钮会产生几条错误消息,所以我省略了。):

public void onClick(View v)

     switch(v.getId())
     case (R.id.plusbutton):
                 Button myButton = new Button(this);
                 myButton.setText("Add Me");

                 LinearLayout ll = (LinearLayout)findViewById(R.id.buttonlayout);
                 LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
                 ll.addView(myButton, lp);
                 break;
    

导入了必要的包。实际上我不确定我是否为带有 LayoutParams 的行选择了正确的 - eclipse 列出了几个包 - 我选择了android.view.ViewGroup.LayoutParams

将activity_main.xml 文件更改为以下文件。 在 strings.xml 文件中添加了一些字符串

我的 activity_main.xml 文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/buttonlayout"
    android:layout_
    android:layout_
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.button_test.MainActivity" >

    <TextView
        android:layout_
        android:layout_
        android:text="@string/hello_world" />

    <Button 
         android:id="@+id/plusbutton"
         android:layout_
         android:layout_
         android:onClick="onClick"
         android:text="@string/plus"  />

</LinearLayout>

【问题讨论】:

【参考方案1】:

问题是您无法在运行时保存到layout 文件等资源。因此,您的选项(AFAIK)是将Button 的参数和属性保存到数据库或其他持久存储中,然后在每次启动时检查以重新创建Button。我想这会很麻烦,而且如果不小心的话,很容易出错。

另一个选项,如果有有限数量的Buttons 可用,是简单地在你的xml 中创建它们,然后使用visibility 属性从gone/invisible 更改为@987654328 @ 需要时。

【讨论】:

【参考方案2】:

Android 是“无状态的”——换句话说,除非您“保存”更改,否则它们将被丢弃。您需要做的是包含一种方法来持久保存您希望在用户与您的应用程序直接交互之后继续存在的任何更改。此外,您应该假设任何更改都可能在之后立即被丢弃 - 换句话说,不要“等待”保存更改。如果用户的电话响起,您的应用程序可能会在调用onPauseonStoponDestroy 之前进入后台并被杀死。

考虑将按钮可见性的“标志”保存到SharedPreferences 中,然后读取onCreateonStartonResume 中的标志。您可能可以使用其中任何一种,但您会发现有时其中一种或另一种效果最好(或者根本无法正常工作)。

【讨论】:

onPause 和 onStop 保证会被调用,从 3.0 开始。也就是说,在这两个回调完成之前,系统不会杀死进程。 我的评论并非完全基于文档 - 我可以向您保证,当电池耗尽时不会调用 onPause。但是,如果您查看文档,onPause 是唯一的“不可杀死”方法调用 (developer.android.com/reference/android/app/Activity.html),但即使是文档也推荐“更积极”的数据存储。在我看来,他们提出这个建议是有原因的。 onStop 也是不可杀死的。也就是说,文档的“可杀”部分说明了回调完成后会发生什么。 我刚刚发布的参考资料指出onStop 只能在蜂窝之前被杀死。我的观察是,如果您的应用占用大量内存并且电话响起,鉴于来电的关键性质,Android 可能会在调用 onPause 之前将其杀死。

以上是关于从应用程序内永久添加按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何永久保存数据,以便稍后在 Android 中访问?

是否可以制作一个触发 PWA“添加到主屏幕”安装横幅的应用内按钮?

在 iTunes Connect 中添加新的应用内购买时保存按钮消失

如何停用Admob插页式广告?

应用内购买恢复按钮

如何通过单击按钮从颤振应用程序中使用应用内浏览器打开 URL?