繁体   English   中英

保存动态创建的按钮android

[英]Saving dynamically created button android

我试图在一个单独的活动中保存我动态制作的按钮,但我似乎无法让它工作。 以下是我在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上动态创建按钮并导航到它,但我无法保存按钮,它立即返回到两个原始按钮。

任何帮助真的很感激,我是一个新手,我只是想尝试一些这方面的东西。 谢谢!

那是因为你首先使用setContentView设置View,它基本上只显示你在当前Activity中膨胀的Layout。 然后你开始一个新的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);
}

编辑:

好吧,既然你想要实现一些与我想的不同的东西,你应该尝试另一种方法。

您正在尝试从第二个Activity获取Result ,因此在此处使用startActivityForResult() (请参阅文档 )方法是完美的。 我假设您的应用程序使用MainActivity作为显示的第一个Activity。

不是通过发出startActivity()来启动第二个Activity,而是使用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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM