【问题标题】: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_width="match_parent"
    android:layout_height="match_parent"
    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_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

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

</LinearLayout>

【问题讨论】:

    标签: java android xml eclipse button


    【解决方案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 之前将其杀死。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      相关资源
      最近更新 更多