在一个课程中,我将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);
}
}
}
这是我的保修课,带有我的二传手和吸气剂。
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 :(得分:1)
您在两个类中创建一个新实例,这意味着当您在第二个类中获取它时,您没有在该类的实例上设置该值。根据您的描述,变量不是静态的,这意味着值取决于实例。整数基元的默认值为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并将其作为额外的意图。而“相当基本”我指的是一个你实际上可以序列化的类。像Context这样的类不能被序列化,所以你需要添加一个方法,在反序列化后添加它,并将不可序列化的字段标记为瞬态。或者直接传递基元。
您可以使用parcelable而不是Serializable,但这是首选项。
答案 1 :(得分:0)
您将数据添加到intent中。见how to pass primitives。或者,如果要传递对象,则必须先将其展平,然后then pass the parcelable。每个意图都有自己的地址空间