我正在尝试保存我在单独的活动中动态制作的按钮,但我似乎无法让它工作。以下是我在CreateButton.java中尝试过的内容:
private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);
public static int generateViewId() {
for (;;) {
final int result = sNextGeneratedId.get();
// aapt-generated IDs have the high byte nonzero; clamp to the range under that.
int newValue = result + 1;
if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0.
if (sNextGeneratedId.compareAndSet(result, newValue)) {
return result;
}
}
}
public void Submit (View view) {
Intent myIntent = new Intent(CreateNewClass.this, MainActivity.class);
EditText mEdit = (EditText)findViewById(R.id.class_name);
String name = mEdit.getText().toString();
mEdit = (EditText)findViewById(R.id.class_semester);
String semester = mEdit.getText().toString();
mEdit = (EditText)findViewById(R.id.class_year);
String year = mEdit.getText().toString();
Button myButton = new Button(this);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
myButton.setId(generateViewId());
}
else {
myButton.setId(Button.generateViewId());
}
myButton.setText(name + " " + semester + " " + year);
setContentView(R.layout.activity_main);
LinearLayout ll = (LinearLayout)findViewById(R.id.main_screen);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams
(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
ll.addView(myButton, layoutParams);
startActivity(myIntent);
}
这是activity_main的我的.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_screen"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/select" />
<Button
android:layout_height="wrap_content"
android:clickable="true"
android:autoLink="web"
android:layout_width="match_parent"
android:id="@+id/button_so"
android:text="@string/Google"
android:linksClickable="true"
android:onClick="goToGoogle"/>
<Button
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="@string/newClass"
android:autoLink="web"
android:clickable="true"
android:id="@+id/button_su"
android:onClick="goToCreate"/>
</LinearLayout>
它在mainActivity上动态创建按钮并导航到它,但我无法保存按钮,它会立即返回到两个原始按钮。
任何帮助都非常感谢,我是一个新手,我只是想学习一些这方面的东西。谢谢!
答案 0 :(得分:3)
这是因为您首先使用setContentView
设置了视图,这基本上只显示您在当前活动中充气的布局。
然后你开始一个新的Activity,它自己启动一个完全独立的View,因此仍然显示默认按钮。
如果要设置文本并在实际的Activity中添加Button,最好将String作为Intent Extra传递。
因此,您的submit
方法应如下所示:
//by the way you shouldn't start method names with upper case
public void submit (View view) {
Intent myIntent = new Intent(CreateNewClass.this, MainActivity.class);
EditText mEdit = (EditText)findViewById(R.id.class_name);
String name = mEdit.getText().toString();
mEdit = (EditText)findViewById(R.id.class_semester);
String semester = mEdit.getText().toString();
mEdit = (EditText)findViewById(R.id.class_year);
String year = mEdit.getText().toString();
String buttonText = name + " " + semester + " " + year;
myIntent.putExtra("button_text", buttonText);
startActivity(myIntent);
}
然后在MainActivity
中,您可以通过将以下代码粘贴到onCreate
方法中来放置按钮。
Intent intent = getIntent();
String buttonText = intent.getStringExtra("button_text");
//activity could also be started without providing the extra
if(buttonText != null){
Button button = new Button(this);
button.setText(buttonText);
LinearLayout ll = (LinearLayout)findViewById(R.id.main_screen);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams
(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
ll.addView(button, layoutParams);
}
修改强>
好的,既然你想要实现一些与我想的不同的东西,你应该尝试另一种方法。
您正尝试从第二个活动中获得Result
,因此最好在此处使用startActivityForResult()
(请参阅documentation)方法。
我假设您的应用程序使用MainActivity
作为第一个显示的Activity。
不是通过发出startActivity()
来启动第二个活动,而是使用startActivityForResult()
提供任何常量作为请求代码。
在submit
方法中,您可以移除startActivity(myIntent)
行,而是将以下代码放在那里:
setResult(Activity.RESULT_OK, myIntent);
finish();
再次在MainActivity中,您可以使用以下实现覆盖onActivityResult
方法:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//you specified the request code before, when launching the second activity
if(requestCode == ADD_USER_REQUEST){
if(resultCode == Activity.RESULT_OK){
String buttonText = data.getStringExtra("button_text");
if(buttonText != null){
Button button = new Button(this);
button.setText(buttonText);
LinearLayout ll = (LinearLayout)findViewById(R.id.main_screen);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams
(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
ll.addView(button, layoutParams);
//here comes the part that saves the button strings persistently
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
Set<String> buttonSet = prefs.getStringSet("saved_buttons",null);
if(buttonSet == null){
buttonSet = new HashSet<String>();
}
buttonSet.add(buttonText);
prefs.edit.putStringSet("saved_buttons", buttonSet).commit();
}
}
}
最后,当活动重新启动时,您需要重建旧布局。将以下代码放在MainActivity.onCreate
中,删除Intent Extra内容。
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
Set<String> buttonSet = prefs.getStringSet("saved_buttons", null);
if(buttonSet != null){
LinearLayout ll = (LinearLayout)findViewById(R.id.main_screen);
for(String buttonText : buttonSet){
Button button = new Button(this);
button.setText(buttonText);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams
(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
ll.addView(button, layoutParams);
}
}