我是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;
}
}
答案 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
的实例。 poss
和pos
彼此无关,其内部属性可能具有完全不相关的值。我相信这解释了为什么你不能为不同的实例看到相同的属性值。
至于如何处理这个,@ 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();
}
}