【问题标题】:How to get data from objected created in other class in new class - java如何从新类的其他类中创建的对象获取数据 - java
【发布时间】:2016-05-20 17:46:07
【问题描述】:
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);
    }

}

我的问题是,如果我在第一类中声明对象,并将其参数编号设置为 5,如何从其他类中获取此编号,因为现在我的 apk 在读取“int i =sd.get_numb();”时崩溃了“klasaB”类。 任何建议如何使这项工作? ps:我不想用静态变量,也不想用 Intents 的 putExtra。

【问题讨论】:

    标签: java android oop object


    【解决方案1】:

    如果数据是简单/原始的,则使用 Intent 将数据从一个活动传递到另一个活动。这就是 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();
    
    }
    

    【讨论】:

      【解决方案2】:

      您可能混淆了 Activity/MainActivity/AppCombatActivity 继承...我怀疑您看到错误的原因 - 顺便说一下,请查看“如何提问”并在下次包含更多信息 - - 是 klasaB 中的 sd 从未初始化。

      MainActivity.SD 将在 onCreate() 之后保存该 5,而 klasaB.sd 从未设置为任何值。

      【讨论】:

      • 现在我在 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() 行;它不应该这样工作吗?
      • 如果您能更具体地了解错误是什么,那将会很有帮助......在这里,klasaB.main 似乎从未被实例化过。
      • 引起:com.example.ivica.optest.klasaB.onCreate(klasaB.java:19) 处的 java.lang.NullPointerException -> int i = main.SD.get_numb(); ,你是什么意思 klasaB.main 永远不会被实例化?我不是 MainActivity main 能够从 MainActivity 获取变量作为 SD 吗?
      • 理解这里发生的事情很重要...实例化是当你创建一个类的单个实例时——而不是声明一个变量名!如果你声明了一个变量,但在使用它之前没有实例化,程序会尝试使用你的变量来引用一个实例,但该变量仍然会引用null。清楚吗(呃)?
      【解决方案3】:

      您永远不会在 B 类中引用或实例化 SD。要将数据获取到 B 类,您需要将数据设置为 Intent 中的额外数据。大多数类无法在意图中发送,因此对于您的情况,您应该传递对象的原始类型,然后创建对象。

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

      然后在B类

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

      【讨论】:

      • 这没关系,但我不想这样做。如何使用 int i = main.SD.get_numb(); 获取数字在 klasaB 中,在开始时声明 MainActivtiy main;
      【解决方案4】:

      您可以使用实现 SerializableParcelable 来访问您的类对象

      1.在你的 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的对象并意图共享给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);
      }
      }
      

      3.B类访问

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
      
          ShareData sd = (ShareData)getIntent().getSerializableExtra("key").
          System.out.println("Saved numb:" + sd.get_num());
      }
      

      【讨论】:

      • 这很酷,有没有另一种方法可以在没有 Intents 的情况下获取数据,因为如果我有 10 个变量,并且总是向它们发送 trought 活动,有没有办法让类具有构造函数, setter 和 getter 以及根据需要更改和检索其他类的数据,例如,如果我有 classA,我会从 classB 创建一个对象,将其名称设置为“John”,并在 classC 中使用创建的对象中的 get_name A 类?
      • 使用实现 Serializable 到 classB,您可以轻松地在两个活动之间共享它。只需使用 putExtra 通过 key 发送和访问 getIntent 即可,例如 ShareData sd = (ShareData) getIntent().getSerializableExtra("key") 或者您可以使用声明为静态的方式共享 classB 对象
      【解决方案5】:

      使用单例类

      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()

      【讨论】:

      • Tnx,但现在我没有得到数字 5 作为输出,我得到数字 0,有什么建议吗?
      • 首先你必须在 classA 中设置号码,然后在 B 类中使用 ShareData sd = ShareData.getInstance(); sd.get_numb()
      • 公共类 MainActivity 扩展 Activity { public ShareData SD = new 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(this,klasaB.class);开始活动(一); } } 仍然得到 0 :S :S :S
      • 不要使用public ShareData SD = new ShareData() 创建新对象ShareData SD = ShareData.getInstance();
      猜你喜欢
      • 2017-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多