2016-05-20 3 views
-1
public class MainActivity extends AppCompatActivity { 

    public ShareData SD = new ShareData(); 

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

     SD.set_numb(5); 
    } 

    // when button clicked 
    public void noviEkran(View view){ 
     Intent i = new Intent(this,klasaB.class); 
     startActivity(i); 
    } 
} 




public class ShareData { 

    private int number; 

    public ShareData(){ 
     this.number=0; 
    } 
    public void set_numb(int num){ 
     number = num; 
    } 
    public int get_numb(){ 
     return number; 
    } 
} 


public class klasaB extends Activity{ 

    ShareData sd; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     int i =sd.get_numb(); 
     System.out.println("Saved numb:" + i); 
    } 

} 

Мой вопрос: если я объявляю объект в 1-м классе и задаю его номер параметра 5, как получить это число от другого класса, теперь мой apk падает при чтении «int i = sd.get_numb();» в классе «klasaB». Любое предложение, как сделать эту работу? ps: Я не хочу использовать статические переменные или putExtra с намерениями.Как получить данные от объекта, созданного в другом классе в новом классе - java

ответ

-1

Использование одноэлементно класса

Объявите экземпляр в ShareData класса:

public class ShareData { private static ShareData sdInstance = null; ...}

добавить этот метод в ShareData класс:

public static ShareData getInstance(){ 
    if(sdInstance == null){ 
     sdInstance = new ShareData(); 
    } 
    return sdInstance; 
} 

Чтобы получить тот же объект в других классах, используйте этот

ShareData sd = ShareData.getInstance();

теперь вы получите тот же sd.get_numb()

+0

Tnx, но теперь я не получаю номер 5 как вывода, я получаю номер 0, любое предложение почему? – Plexer

+0

Сначала вы должны SET_NUMBER в сказать 'classA' затем использование ' ShareData с.о. = ShareData.getInstance(); '' sd.get_numb() ' в классе B –

+0

общественного класса MainActivity расширяет активность { общественного ShareData SD = новый ShareData(); @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); SD.set_numb (5); } // при нажатии кнопки public void noviEkran (View view) { Intent i = new Intent (это, klasaB.class); startActivity (i); } } еще 0: S: S: S – Plexer

0

Возможно, вы перепутали деятельность Activity/MainActivity/AppCombatActivity ... Я подозреваю, что причина, по которой вы видите ошибку, - кстати, загляните в «как спросить» и включите в следующий раз немного больше информации - это то, что sd в klasaB никогда не инициализируется.

MainActivity.SD будет удерживать это 5 после его onCreate(), тогда как klasaB.sd никогда не настроен ни на что.

+0

Теперь я установлен в klasaB MainActivity main; @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); int i = main.SD.get_numb(); System.out.println ("Сохранено онемение:" + i); , ошибка находится в строке main.SD.get_numb(); не должно ли это работать так? – Plexer

+0

Было бы полезно, если бы вы уточнили, что такое ошибка ... Здесь не похоже, что klasaB.main когда-либо создавался. –

+0

Вызвано: java.lang.NullPointerException at com.example.ivica.optest.klasaB.onCreate (klasaB.java:19) -> int i = main.SD.get_numb(); , как вы понимаете, что klasaB.main никогда не активируется? Разве я не с MainActivity main, способным получать переменные из MainActivity в качестве SD? – Plexer

0

Вы никогда не ссылаетесь или не создаете экземпляр SD в классе B. Чтобы получить данные в ClassB, вам нужно будет установить данные как дополнительные в намерении. Большинство классов не могут быть отправлены в намерении, поэтому для вашего случая вы должны передать примитивные типы объекта, а затем создать объект.

// when button clicked 
public void noviEkran(View view){ 
Intent i = new Intent(this,klasaB.class); 
i.putExtra("TAG", SD.get_num()); 
startActivity(i); 

А потом в классе В

ShareData SD = new ShareData(); 
SD.set_num(getIntent.getIntExtra("TAG", 0); 
+0

Это оке, но я не хочу этого делать. Как получить номер с int i = main.SD.get_numb(); в klasaB с объявленной в начале MainActivtiy main; – Plexer

+0

@Plexer Вы не можете не использовать глобальные переменные ... и не делайте этого. –

0

Вы можете получить доступ к объекту класса либо с помощью орудий Serializable или Parcelable

1.Implement сериализуемые в классе ShareData

public class ShareData implements Serializable{ 

    private int number; 

    public ShareData(){ 
     this.number=0; 
    } 
    public void set_numb(int num){ 
     number = num; 
    } 
    public int get_numb(){ 
     return number; 
    } 
} 

2. создать объект SharedData и поделиться с намерением t о ClassB

public class MainActivity extends AppCompatActivity { 

public ShareData SD = new ShareData(); 

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

    SD.set_numb(5); 
} 

// when button clicked 
public void noviEkran(View view){ 
    Intent i = new Intent(this,klasaB.class); 
    i.putExtras("key", SD) 
    startActivity(i); 
} 
} 

в ClassB 3. Ограничение

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ShareData sd = (ShareData)getIntent().getSerializableExtra("key"). 
    System.out.println("Saved numb:" + sd.get_num()); 
} 
+0

Это классно, есть ли другой способ получить данные без намерений, если я дам сказать 10 переменных и всегда отправляю их завышенные действия, есть способ иметь класс с конструктором, сеттер и геттер, а также изменять и извлекать данные из других классов по мере необходимости. Например, если у меня есть класс A, я создаю объект из класса B, устанавливаю его имя в «John», а в classC использую get_name из объекта objected, созданного в классе A? – Plexer

+0

Используя реализацию Serializable в classB, вы можете легко поделиться им между двумя действиями. Просто используйте putExtra для отправки и доступа к нему с помощью getIntent по ключу, например, ShareData sd = (ShareData) getIntent(). GetSerializableExtra («ключ») или вы можете совместно использовать объект objcet класса, объявленный как статический – LeoMobDev

1

Если данные простым/примитивным затем использовать Intent для передачи данных от одного вида деятельности другому. Для этого и предназначен намерение.

Если это не какая-то сложная структура данных или объект, я бы расширил приложение, создав собственный подкласс. Класс приложения (как следует из названия) доступен для всех видов деятельности, даже когда приложение переходит из одного в другое. Ниже приведен очень простой пример, чтобы показать вам эту идею. Вы можете изменить/настроить это для ваших нужд.

public class MyApplication extends Application { 
    private X x; 

    public static void setX(X x) { ... } 
    public static X getX() { ... } 
} 
public class ActivityA extends Activity { 

    ... 
    MyApplication.setX(x); 

} 
public class ActivityB extends Activity { 

    ... 
    X x = MyApplication.getX(); 

} 
+0

Tnx для информации – Plexer