2015-08-11 2 views
0

У меня есть 3 действия. Наборы первой активности id, деятельность вторая menu и деятельность третья, чтобы показать id.Android Set/Get Get() возвращает null в Android

Но, третий вид деятельности null id. Зачем?

класс A.class:

package a.b.c.model; 
public class Profil { 
    private String pid; 
    public String getpId() { 
     return pid; 
    } 
    public void setpId(String id) { 
     this.pid = pid; 
    } 
} 

b.class:

package a.b.c; 
import a.b.c.model; 
public class bextends Activity { 
    Profil p = new Profil(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.b); 
     p.setpId("TEST"); 
    } 
} 

c.class:

package a.b.c; 
import a.b.c.model; 
public class c extends Activity { 
    Profil p = new Profil(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.c); 
     final TextView tex = (TextView) findViewById(R.id.pid); 
     tex.setText(p.getpId()); 
    } 
} 

d.class

package a.b.c.model; 
public class d extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.d);; 
    } 
} 

ОБНОВЛЕНИЕ: Класс активности б -> д -> с

+1

Активность b и c содержит разные объекты ** Profil **. как вы можете получить значение от первого объекта, используя вновь созданный второй? – Emil

+0

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

ответ

0

В вашем b.class создание нового объекта и установка значения для объекта означает, что он является локальным объектом, и вы можете использовать его только в описании класса. В вашем c.class, когда когда-либо ваш ярлык, новый объект означает, что он только что создан, т. Е. В нем нет никаких значений.

Когда вы когда-либо создавали объект, как показано ниже, он всегда пуст и имеет только нулевые значения.

 Profil p = new Profil(); 

Так подходит к вашему решению, вы можете достичь его многими способами на основе ваших спецификаций/требований/объем

один способ сделать ваши классы, как показано ниже

класс A.class

package a.b.c.model; 
public class Profil implements Serializable { 

     /** auto generated serial version id 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    private String pid; 
    public String getpId() { 
     return id; 
    } 
    public void setpId(String id) { 
     this.id = id; 
    } 
} 

b.Класс

package a.b.c; 
import a.b.c.model; 
public class bextends Activity { 
    Profil p = new Profil(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.b); 
     p.setpId("TEST"); 
} 

после некоторого действия кнопки мыши (навигация от б до в) вы можете отправить сериализованный объект Профиль для класса B в C, а затем вы можете использовать его

ваше намерение должно быть, как это

Intent i = new Intent(this, D.class); 
i.putExtra("sampleObject", p); 
startActivity(i); 

В вашей деятельности «D» вам нужно получить объект, в котором ваша функция отправки б.

d.class

package a.b.c.model; 
public class d extends Activity { 

    Profil p = null; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.d); 

     p = (Profil)getIntent().getSerializableExtra("sampleObject"); 
    } 
} 

ваше намерение должно быть, как это (D деятельность в C деятельности)

// this you can write in your navigation part probably in a button click 
Intent i = new Intent(this, C.class); 
i.putExtra("sampleObject", p); 
startActivity(i); 

После получения объекта, когда все ваши Навигационное от деятельности 'D' к деятельности «C 'необходимо передать обновленный объект таким же образом

Тогда ваш класс C должен быть таким, как это

C.class

package a.b.c; 
import a.b.c.model; 
public class c extends Activity { 
    Profil p = null; 

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

     p = (Profil)getIntent().getSerializableExtra("sampleObject"); 

     final TextView tex = (TextView) findViewById(R.id.pid); 
     tex.setText(p.getpId()); 
    } 
} 

Вот это :) Теперь вы можете использовать обновленный объект Профиль в классе C, а также ..

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

+0

c.class - это третий вид деятельности, а a.class - это первая активность? – Gsurha

+0

a.class не является активностью, b.class - это первая активность, а c.class - вторая активность. вы можете установить значение в b.class и передать полный объект в c.class через намерение. Я обновил всю логику в своем ответе. –

+0

Используйте 'Parcelable' [вместо' Serializable'] (http://www.developerphil.com/parcelable-vs-serializable/) – mbmc

1

В c.class, p новый объект с pid == null. Вам необходимо пройти его от b к c через Bundle.

2

Если вы намерены pid быть глобальными для Profil класса, вы должны сделать pid переменной статичной. Статическая переменная принадлежит самому классу, а не экземпляру указанного класса.

Таким образом, наше исправление будет выглядеть так же просто, как private static String pid;, а также сделать наши геттеры и сеттеры статичными.

Если вы хотите, чтобы у каждого Profil был свой pid, вам необходимо сдать правильный экземпляр Profil туда, где это необходимо. Новый экземпляр класса обычно создается с помощью ключевого слова new. Поэтому помните, что если мы видим new, есть новый экземпляр, и любые нестатические переменные не сохраняются и отделены от других экземпляров.

Смежные вопросы