2013-07-05 4 views
1

Я знаю, что могу передавать некоторые значения между действиями с использованием намерений. Однако, если я хочу передать всю деятельность в другую деятельность, я думаю, что это нехороший подход. Есть ли другой способ сделать это?
Передать ссылку одного вида деятельности на другую деятельность

У меня есть настройка Активность, в которой я меняю цвет. Поэтому после того, как я вернусь к своей основной деятельности, я бы хотел применить эти цвета. Для этого мне нужно получить доступ к полям MainActivity после изменения значения цвета, поэтому внутри PreferenceActivity. Другими словами, я хочу иметь доступ к основным полям деятельности из класса PreferenceActivity. Есть идеи?

ответ

3

Вы должны использовать SharedPreference, а затем получить доступ к этому в своем основном действии. Я рекомендую вам читать по адресу http://developer.android.com/guide/topics/ui/settings.html, потому что кажется, что вы неправильно выполняете свои настройки. Часть, которую вы можете особо заинтересовать, - это раздел «Чтение настроек». Тем не менее, я настоятельно рекомендую вам прочитать все, а затем правильно выполнить свои настройки.

Обновленный ответ с 3 различными способами (что я могу думать):

1) Начните предпочтение деятельности с помощью startActivityForResult(), то в вашем onActivityResult() доступа, который SharedPreference и внесите необходимые изменения. Смhere

2) Зарегистрировать SharedPreferenceChangeListener с вашим MainActivity, которая будет вызвана, когда какие-либо изменения происходят в вашей SharedPreference. См.hereдля подробного обсуждения. Также см. Мой первоначальный ответ.

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

Я бы лично пойти с опцией 2, потому что обратный вызов был создан для этой цели.

+0

Я уже читал это, но хочу, чтобы изменения вступили в силу сразу после возвращения из PreferenceActivity – Marek

0

Я думаю, что вы можете передать значение с помощью метода putExtra (name, value). И после того, как вы начнете новую деятельность, вы можете получить значение, которое вы передаете, используя метод getStringExtra (name).

+0

Я хочу передать всю деятельность ... – Marek

+5

@Marek: ** "Я хочу передать всю деятельность ..." ** - Нет, не пытайтесь это сделать. Сохраните изменения в настройках, а в «MainActivity» просто перезагрузите изменения в 'onResume()'. Либо это, либо используйте 'startActivityForResult (...)', который позволяет вам передавать данные обратно в вызывающий 'Активность' в' Bundle'. – Squonk

+0

@Squonk Я сделал то, что вы предложили. Я просто понял, что прохождение всей деятельности - плохая идея. Однако, как вы думаете, в некоторых случаях это может быть лучше? Например, если я хотел бы изменить много данных? Пожалуйста, поместите свой комментарий в качестве ответа, он удовлетворяет меня больше всего, поэтому я хотел бы его принять. – Marek

0

Если вы хотите внести множество изменений, необходимых во многих действиях, которые вы измените в любом из них.

И получить доступ к последнему изменению данных из всех видов деятельности и изменить также.

например.

Constants.java

public class Constants 
{ 

    public static String name; 
} 

В вашем MainActivity у вас есть EditText.

MainActivity.java

public class MainActivity extends Activity { 

    private EditText yourName; 
    private Button btn; 

    @Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    yourName = (EditText) findViewById(R.id.yourName); 

    btn = (Button) findViewById(R.id.btn); 

    btn.setOnClickListener(new OnClickListener() 
    {  
     public void onClick(View v) 
     { 

      Constants.name = yourname.getText().toString(); 
      Intent intent = new Intent(getApplicationContext(),Activity2.class); 
      startActivity(intent); 

     } 
    }); 

} 

В вашем деятельности2 Вы TextView и получать значение, которое вы вводите в MainActivity.java без прохода в Намерения.

Activity2.java

public class Activity2 extends Activity { 

    private TextView yourName; 

    @Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    yourName = (TextView) findViewById(R.id.tv_yourName); 

    // directly use ferom serializable class 
    yourname.setText(Constants.name); 
} 

как использовать много значений от всех видов деятельности и изменения от всей деятельности.

+0

Я думаю, что в примере, который вы представили для класса Constants, не обязательно быть Serializable. – Marek

+0

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

+0

спасибо @Marek, чтобы указать на это и сказать мне ... –

0

Общие настройки могут использоваться. Если вы хотите, чтобы ваши изменения отражались сразу, добавьте слушателя. См. SharedPreferences.onSharedPreferenceChangeListener. Это простой способ сделать.