我是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>
非常感谢您的帮助。
您包含Button的ArrayList为空,因为您不存储它们。可以使用SharedPreferences而不是使用该ArrayList(如果您没有其他目的)。 SharedPreferences使用键值对存储数据。 SharedPreferences有两个选项:
1。基于活动的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。基于应用程序的SharedPreferences:您可以在应用程序中的任何活动上进行访问。
//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 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将返回相同的值(在本例中为1)。您需要修复它,例如:
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的click方法中使用此方法。每次单击该按钮以创建新按钮时,该方法有助于保存有关您的按钮的信息。
要重新加载Button,您可以使用类似的方法:
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()方法中调用此方法。