使用get和set传递数据

时间:2018-01-09 19:08:05

标签: 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);
        }
    }
}

这是我的保修课,带有我的二传手和吸气剂。

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);
    }
}

为什么这不可能?

2 个答案:

答案 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。每个意图都有自己的地址空间