保存用户添加的动态按钮 android

Save dynamic button android added by user

我是 Android 的初学者,我在保存动态按钮时遇到了问题。 代码应该在用户需要时动态添加一个按钮。 当用户单击 addService 时,此代码从第二个 Activity 中获取(按钮的名称和用于此按钮的意图中的值),然后在此 Activity 中使用名称动态添加按钮和意图,用户可以单击它以获取服务。 当我们重新加载应用程序时,这些按钮将消失。 如何保存用户动态添加的按钮?

源代码:

package com.example.fst.miniprojetandroidn1;


import androidx.appcompat.app.AppCompatActivity;


import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;


import java.util.ArrayList;

public class ajouter_programme extends AppCompatActivity {

    ArrayList<Button> list_programme=new ArrayList<Button>();
    Button Addbutton;
    int count = 1,c;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ajouter_programme);
        setTitle("Liste des programmes ");
        Addbutton = findViewById(R.id.plusbutton);

        Addbutton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {


                Button myButton = new Button(ajouter_programme.this);
                c=count++;

                myButton.setId(c);
                myButton.setText("Programme " + c);
                list_programme.add(myButton);
                LinearLayout ll = (LinearLayout) findViewById(R.id.buttonlayout);
                LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                ll.addView(myButton, lp);
              myButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        ajouterprog();
                    }
                });

            }


        });



    }
    public void ajouterprog(){
        Intent list_programmes_Intent = new Intent(ajouter_programme.this,ajouter_medicamement.class);
        startActivity(list_programmes_Intent);
    }
}

AMD .xml 是

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/buttonlayout"
    android:layout_width="match_parent"

    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">


    <Button
        android:id="@+id/plusbutton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Ajouter programme"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


</LinearLayout>

非常感谢您的帮助。

包含按钮的 ArrayList 是空的,因为您没有存储它们。您可以使用 SharedPreferences 而不是使用 ArrayList(如果您没有任何其他目的)。 SharedPreferences 使用键值对来存储数据。 SharedPreferences有两个选项:

1.Activiy 基于 SharedPreferences: 您只能使用与您使用 SharedPreferences 相同的 Activity 进行访问。您无法通过应用中的任何其他活动访问它。

//Call Activity based SharedPreferences
SharedPreferences sp = getPreferences(MODE_PRIVATE);
//Calling Editor interface for transaction
SharedPreferences.Editor editor = sp.edit();
//Put primitive data types (int, String, boolean, float etc.)
editor.putInt(String key, int value);
editor.putString(String key, String value);
editor.putBoolean(String key, Boolean value);
//Apply your changes and finish editing.
editor.apply();

2.Application 基于 SharedPreferences: 您可以在您的应用程序中访问任何 Activity。

//Call Activity based SharedPreferences
SharedPreferences sp = getSharedPreferences(String name,MODE_PRIVATE);
//Calling Editor interface for transaction
SharedPreferences.Editor editor = sp.edit();
//Put primitive data types (int, String, boolean, float etc.)
editor.putInt(String key, int value);
editor.putString(String key, String value);
editor.putBoolean(String key, Boolean value);
//Apply your changes and finish editing.
editor.apply();

注意: 字符串名称 是 xml 文件的名称,您的数据将与 SharedPreferences 一起存储,您可以随意命名。此外,对于 SharedPreferences,您只能存储原始数据类型(如果您不使用 GSON)。存储有关您的按钮的信息,并在您每次开始或恢复 Activity 时重新创建。

从共享首选项取回数据:

//Activity based SharedPreferences
SharedPreferences sp = getPreferences(MODE_PRIVATE);
//For getting int
int value = sp.getInt(String key, defautValue);
//For getting String
String value = sp.getString(String key, defaultValue);
//For getting Boolean
Boolean value = sp.getBoolean(String key, defaultValue);

注意: int count 将 return 相同的值(在本例中为 1),每次您开始或恢复 Activity回来了。您需要像这样修复它:

SharedPreferences sp = getPreferences(MODE_PRIVATE);
int count = sp.getInt("count", 1);

例如一种存储信息的方法:

private void saveButton(int count) {
    //Call Activity (or Application) based SharedPreferences
    SharedPreferences sp = getPreferences(MODE_PRIVATE);
    //Calling Editor interface for transaction
    SharedPreferences.Editor editor = sp.edit();
    //Put primitive data types (for this case its integer)
    //Number of buttons
    editor.putInt("count", (count + 1));
    //Ids of each Button
    editor.putInt("btn_id" + count, count);
    //Apply your changes and finish editing.
    editor.apply();
}

您可以在用于创建新 Button 的 Button 的单击方法中使用此方法。每次您单击该按钮以创建新按钮时,该方法都有助于保存有关您的按钮的信息。

要加载 Button(s),您可以使用如下方法:

private void loadButtons() {
    //Find your layout which buttons will be added.
    LinearLayout ll = (LinearLayout) findViewById(R.id.buttonlayout);
    //Call Activity (or Application) based SharedPreferences
    SharedPreferences sp = getPreferences(MODE_PRIVATE);
    //Get number of buttons you've saved.
    int count = sp.getInt("count", 1);
    for (int i = 1; i < count; i++) {
        //Get back required datas for creating for your Buttons again
        int id = sp.getInt("btn_id" + i, 1);
        //Create new button
        Button btn = new Button(this);
        btn.setText("Programme" + i);
        btn.setId(id);
        //Add button to your layout
        ll.addView(btn);
        //Set ClickListener for every Button
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ajouterprog();
            }
        });
    }

您需要在 onCreate() 或 onResume() 方法中调用此方法。