在一个类中,我将 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/