保存用户添加的动态按钮 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() 方法中调用此方法。
我是 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() 方法中调用此方法。