java - 使用 get 和 set 传递数据

标签 java android

在一个类中,我将 ID 设置为我的保修类。我添加了我的完整代码,这样你就可以看到哪里出了问题。我声明了这个类,所以我可以调用它。在 setter 上设置 ID,最后我使用 getter 在另一个类上检索它。

public class HomeActivity extends AppCompatActivity {`

    DatabaseHelper db = new DatabaseHelper(this);
    LinearLayout buttonViewWarrantys;
    Warranty wr = new Warranty();

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

        Display display = getWindowManager().getDefaultDisplay();
        int width_display = display.getWidth();
        width_display = (width_display/10) * 8;
        Button addWarBtn = findViewById(R.id.add_warranty);
        buttonViewWarrantys = findViewById(R.id.show_warratys);
        addWarBtn.getLayoutParams().width = width_display;
        addWarBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent inputScreen = new Intent(HomeActivity.this, InputScreen.class);
                startActivity(inputScreen);
            }
        });

        updateWarrantys();
    }

    @Override
    public void onResume() {
        super.onResume();
        updateWarrantys();
    }

    void updateWarrantys(){
        List<Warranty> warrantys = db.getAllContacts();
        for (Warranty cn : warrantys) {
            final String ID = Integer.toString(cn.getID());
            String buttonName = ID + "_" + cn.getName();
            String buttonText = "Name: " + cn.getName() + '\n' + " Bought on: " + cn.getStartDate() + '\n' + " Warranty stops on: " + cn.getEndDate();

            Button buttons = new Button(this);
            buttons.setTag(buttonName);
            buttons.setText(buttonText);
            buttons.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
            final String warranty_name = cn.getName();
            final String start_date = cn.getStartDate();
            final String end_date = cn.getEndDate();
            final String img_path = cn.getImgFilePath();

            buttons.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    System.out.println(ID);
                    wr.setID(Integer.parseInt(ID));
                    //new Warranty(Integer.parseInt(ID), warranty_name, start_date, end_date, img_path);
                    Intent showWarranty = new Intent(HomeActivity.this, ShowWarranty.class);
                    startActivity(showWarranty);

                }
            });
            buttonViewWarrantys.addView(buttons);
            String log = "Id: " + cn.getID() + " ,Name: " + cn.getName() + " ,Startdate: " + cn.getStartDate() + " ,EndDate: " + cn.getEndDate() + " ,Path: " + cn.getImgFilePath();
            System.out.println(log);
        }
    }
}

这是我的 Warranty 类以及我的 setter 和 getter。

public int getID() {
    return ID;
}

public void setID(int ID) {
    this.ID = ID;
}

在此之后我尝试检索它,但 ID 的结果是 0,当我设置它时它是 8。

public class ShowWarranty extends AppCompatActivity {`
    Warranty wr = new Warranty();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_warranty);
        int test = wr.getID();
        System.out.println("The number is: " + test);
    }
}

为什么这不可能?

最佳答案

您在两个类中都创建了一个新实例,这意味着当您在第二个类中获取它时,您尚未在该类中的实例上设置值。根据您的描述,变量不是静态的,这意味着值取决于实例。整数基元的默认值为 0,这就是它具有该特定值的原因。

你正在做的伪代码示例:

Warranty x = new Warranty();
x.setID(8);
Warranty y = new Warranty();
System.out.println(y.getID());//Since the ID of y isn't set, it'll print 0

至于可能的解决方案:

如果你的类是相当基础的,只需让它实现 Serializable 并将其作为一个额外的东西放在 Intent 中。 “相当基本”是指您实际上可以序列化的类。像 Context 这样的类不能被序列化,所以你需要添加一个方法来在它被反序列化后将它添加回来,并将不可序列化的字段标记为 transient 。或者直接传递原语。

您可以使用 parcelable 而不是 Serializable,但这是一个偏好问题。

关于java - 使用 get 和 set 传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48175092/

相关文章:

java - 使用 JPQL 和 BooleanExpression 进行分页

android - 如何在 Android 上以编程方式禁用/启用 3G?

android - 程序类型已存在 : BuildConfig

java - Android开发中如何管理Activity继承

android - 如何在 Android.mk 中获取环境变量值?

java - 以编程方式启用通过击键编辑 JTable 单元格

java - xpath 上下文的问题

java - 在 spring-boot 中将 hashmap 转换为 json 字符串

android - PolymorphicJsonAdapterFactory 缺少标签

java - Maven process-classes,只处理编译器改变的那些 :compile