【问题标题】:Getter returning 0 when called from other class从其他类调用时,Getter 返回 0
【发布时间】:2014-09-03 07:59:04
【问题描述】:

我是 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;
    }
}

【问题讨论】:

    标签: java android


    【解决方案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();
            ...
    }
    

    然后在您的片段中获取位置元素并获取浮点数:

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

    【讨论】:

    • 建议人们使用静态变量从长远来看可能没有帮助。 Java 是一种 OO 语言,静态是该语言的非 OO 疣。避免它们是可能的。
    • @StephenC 用 2 个更合适的解决方案更新了我的答案,并展示了其中一个示例。
    【解决方案2】:

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

    Position pos = new Position();
    

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

    Position poss = new Position();
    

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

    至于如何处理这个问题,@user3249477 给出了一些我推荐的选项。

    【讨论】:

    • 我不知道创建更多的类实例会导致更多的堆内存分配......上面的答案很有帮助。
    【解决方案3】:

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

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

    您的点击活动

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

    【讨论】:

    • 感谢您的回复,上面的回答教会了我另一种避免不必要地创建类实例的方法..
    猜你喜欢
    • 2013-05-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2020-05-14
    • 2018-09-10
    • 1970-01-01
    相关资源
    最近更新 更多