从其他类调用时,Getter返回0

时间:2014-09-03 07:59:05

标签: java android

我是Android和Java的初学者,我刚看到一些在java中使用getter和setter方法的视频,当我在同一个类中使用getter和setter方法时效果很好。但是当我使用setter方法从主类设置图像的位置并尝试使用getter方法从我的片段类中检索它时它返回0.在stackoverflow中有一个类似的问题我不明白。请帮帮我.. 我的主要课程:

 public class Login_Register extends Activity implements OnClickListener {
        Login login = new Login();
        Register register = new Register();
    ImageButton LoginB;
        ImageButton RegisterB;

        @Override
        protected void onCreate(Bundle savedInstanceState) {

            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);

            setContentView(R.layout.login_register);
            FragmentManager fmanager = getFragmentManager();
            LoginB = (ImageButton) findViewById(R.id.login_button);
            RegisterB = (ImageButton) findViewById(R.id.Reg_button);
            LoginB.setOnClickListener(this);
            RegisterB.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {

            Positions pos = new Positions();
            pos.setLIpos(LoginB.getY());
            pos.setRIpos(RegisterB.getY());

            FragmentTransaction transaction = fmanager.beginTransaction();
                    switch (v.getId()) {

            case R.id.login_button:

                transaction.add(R.id.Parent, login, "Loginf");
            transaction.addToBackStack("Login");

                break;
            case R.id.Reg_button:
                    transaction.add(R.id.Parent, register, "registerf");
                transaction.addToBackStack("registerf");

                break;
            default:
                break;
            }
            transaction.commit();

            // TODO Auto-generated method stub

        }


    }

我的片段类:

public class Login extends Fragment implements OnGlobalLayoutListener {
    EditText UN, Pass;
    View loginimage, loginusing, loginlayout;

    // Login_Register Lg=new Login_Register();
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View login = inflater.inflate(R.layout.login, container, false);
        // TODO Auto-generated method stub
        UN = (EditText) login.findViewById(R.id.UsernameL);
        Pass = (EditText) login.findViewById(R.id.PassswordL);
        loginimage = login.findViewById(R.id.LoginImage);

        loginusing = login.findViewById(R.id.loginusing);
        loginlayout = login.findViewById(R.id.LoginLayout);
        loginimage.getViewTreeObserver().addOnGlobalLayoutListener(this);
        UN.getBackground().setAlpha(50);
        Pass.getBackground().setAlpha(50);
        Positions poss=new Positions();
        float f=poss.getLIpos();
        ObjectAnimator.ofFloat(loginusing, View.ALPHA, 0,1).setDuration(1000).start();

        return login;
    }
}

使用setter和getter方法的类:

public class Positions {
    private float LIpos=0;
    private float RIpos=0;

    public Positions() {
        // TODO Auto-generated constructor stub
    }
    public float getLIpos() {
        Log.i("allalalla", ""+LIpos);
        return LIpos;
    }
    public void setLIpos(float lIpos) {
        LIpos = lIpos;
    }
    public float getRIpos() {
        return RIpos;
    }
    public void setRIpos(float rIpos) {
        RIpos = rIpos;
    }
}

3 个答案:

答案 0 :(得分:1)

在获取浮动之前,您将实例化您的类。这将创建一个默认类,其浮点数已初始化为0。

Positions poss=new Positions();
float f=poss.getLIpos();

如果要在此类的不同实例之间保存浮点数,请将浮点数设为静态:

private static float LIpos;
private static float RIpos;

或者,您可以保留对保存浮动的实例的引用并将其传递给您的片段,或者您的片段可以直接从您的活动中获取该实例:

public Position pos;
@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    @Override
    public void onClick(View v) {
        pos = new Positions();
        ...
}

然后在你的片段中获取position元素并获取浮点数:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    ...
    float LIpos = ((Login_Register)getActivity()).pos.getLIpos();
    ...
}

答案 1 :(得分:1)

我认为类和实例的概念之间存在混淆。对于属性和功能方面的设计对象,类是一个简单的契约或定义。实例是真正的活动对象,即在运行时应用操作的实例。现在你写的时候:

Position pos = new Position();

在堆内存中,为pos引用指向的特定实例分配内存。如果在其他地方输入:

Position poss = new Position();

它创建了Position引用的另一个类poss的实例。 posspos彼此无关,其内部属性可能具有完全不相关的值。我相信这解释了为什么你不能为不同的实例看到相同的属性值。

至于如何处理这个,@ user3249477提供了一些选项,我建议第二个。

答案 2 :(得分:0)

你做错了。您正在Activity和Fragment中创建Position类的实例。

尝试在Fragment中创建一个方法,该方法将接收您在活动中设置的位置对象,如下所示:

您的活动onClick

  @Override
    public void onClick(View v) {

        Positions pos = new Positions();
        pos.setLIpos(LoginB.getY());
        pos.setRIpos(RegisterB.getY());

        FragmentTransaction transaction = fmanager.beginTransaction();
                switch (v.getId()) {

        case R.id.login_button:

            transaction.add(R.id.Parent, login, "Loginf");
        transaction.addToBackStack("Login");
        login.setImagePosition(pos);

            break;
        case R.id.Reg_button:
                transaction.add(R.id.Parent, register, "registerf");
            transaction.addToBackStack("registerf");
            register.setImagePosition(pos);
            break;
        default:
            break;
        }
        transaction.commit();

        // TODO Auto-generated method stub

    }

你的片段

 class Login extends Fragment implements OnGlobalLayoutListener {

  EditText UN, Pass;
  View loginimage, loginusing, loginlayout;

// Login_Register Lg=new Login_Register();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View login = inflater.inflate(R.layout.login, container, false);
    // TODO Auto-generated method stub
    UN = (EditText) login.findViewById(R.id.UsernameL);
    Pass = (EditText) login.findViewById(R.id.PassswordL);
    loginimage = login.findViewById(R.id.LoginImage);

    loginusing = login.findViewById(R.id.loginusing);
    loginlayout = login.findViewById(R.id.LoginLayout);
    loginimage.getViewTreeObserver().addOnGlobalLayoutListener(this);
    UN.getBackground().setAlpha(50);
    Pass.getBackground().setAlpha(50);

    ObjectAnimator.ofFloat(loginusing, View.ALPHA, 0,1).setDuration(1000).start();

    return login;
}

public void setImagePosition(Positions pos){
    Positions poss=pos;
    float f=poss.getLIpos();
}

}