2015-03-17 1 views
1

Я пытаюсь сохранить кнопку, которую я динамически создаю для отдельного действия, но я не могу заставить его работать. Вот то, что я пытался в моем CreateButton.java:Сохранение динамически созданной кнопки android

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); 
    } 

А вот мой .xml для activity_main:

<?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 и переходит к нему, но Я не могу заставить его сохранить кнопку, она сразу же возвращается к двум оригинальным кнопкам.

Любая помощь действительно ценится, я новичок и просто пытаюсь изучить некоторые из этих вещей на стороне. Спасибо!

ответ

3

Это потому, что вы сначала устанавливаете вид, используя setContentView, который в основном просто отображает макет, который вы надули внутри своей текущей деятельности. И после этого вы начинаете новое действие, которое запускает совершенно независимый просмотр самостоятельно и поэтому все еще отображает кнопки по умолчанию.

Если вы хотите установить текст и добавить кнопку в текущую активность, рекомендуется передать строку в качестве дополнения.

Таким образом, ваш метод 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); 
} 

EDIT:

Хорошо, так как вы пытаетесь достичь что-то немного по-другому, чем я думал, вы должны попробовать другой подход.

Вы пытаетесь получить Result со второго действия, и поэтому было бы идеально использовать метод startActivityForResult() (см. documentation) здесь. Я предполагаю, что ваше приложение использует MainActivity в качестве первого действия, которое отображается.

Вместо запуска второго действия путем выдачи 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); 
    } 
} 
+0

спасибо тонну, это работает, но я хочу, чтобы иметь возможность любого количества кнопок, а не только одного.Кажется, это просто добавляет кнопку на исходный экран, и если я пытаюсь добавить другую, она просто меняет текст этой кнопки, а не добавляет четвертую кнопку – seanscal

+0

. На самом деле она не перезаписывает предыдущую кнопку, но старые не сохраняется в любом месте. Вам нужно, чтобы они были сохранены, поэтому они доступны после повторного запуска приложения? Или вам нужны только они, пока отображается активность? И все ли строки для всех кнопок, которые вы хотите добавить одновременно? –

+0

Ах, да, я как-то понял, что это неправильно. Я определенно пытаюсь сохранить кнопки, чтобы они были доступны после перезапуска. У меня есть только строка, доступная для одной кнопки за раз. Поэтому в теории я бы начал с одной кнопки на главном экране, кнопки добавления. Я нажимаю кнопку добавления на главном экране, заполняю имя на втором экране, а затем имею 2 кнопки, добавление и вновь созданное. Затем, нажав добавить и сделать это снова, вы получите третий ... Если есть более простой способ сделать это, чем я думаю, не стесняйтесь говорить мне, я очень к этому знаком – seanscal