[英]Send a variable from one class in a parameter to another class. Simple error
我想发送给另一个类的变量是int position。 它位于InstantiateItem方法的参数中。 这基本上表明了滑动布局的位置。
现在,变量位置仅在onClick方法中可用。 一旦在方法之外,它就始终为0。将示例放入代码中。
public class Csa{
private int getposition;
public Object instantiateItem(ViewGroup container, int position) {
layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View item_view = layoutInflater.inflate(R.layout.swipe_layout, container, false);
imageView = (ImageView) item_view.findViewById(R.id.image_view);
TextView textView = (TextView) item_view.findViewById(R.id.image_count);
imageView.setImageResource(image_resources[position]);
textView.setText(names[position]);
container.addView(item_view);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
switch(position){
getposition = position;
case 1:
System.out.println(position); //Outputs 1. Correct.
Log.d("Exercise", "Deadlift!");
Intent intent1 = new Intent(CustomSwipeAdapter.this.ctx, AnalysisPage.class);
CustomSwipeAdapter.this.ctx.startActivity(intent1);
break;
case 2:
getposition = position;
System.out.println(position); // Outputs 2. Correct.
System.out.println(getposition()); // Outputs 2. Correct.
Log.d("Exercise", "Squats");
Intent intent2 = new Intent(CustomSwipeAdapter.this.ctx, AnalysisPage.class);
CustomSwipeAdapter.this.ctx.startActivity(intent2);
break;
}
}
});
return item_view;
}
public int getposition() {
return getposition;
}
public class AnotherClass{
Csa chooser = new Csa(this);
private int command = chooser.getPosition();//Debugged. This is 0 always 0. Should be 1/2. Wrong.
public static void main(String args[]){
System.out.println(command);// Always prints out 0.
机箱/开关内的变量始终正确。 但是,如果我正在创建全局变量,或者甚至将位置变量分配给另一个变量,则输出始终为0。 (请参见代码示例)。
最终,我希望position变量位于另一个类中,但输出始终为0。我尝试了Getter / Setter方法,但它们仍然不起作用。
匿名类只能访问封闭类的最终变量。 为了解决此问题,请将以下类(在单独的文件中)添加到您的项目中:
public class ValueHolder<T> {
private T value = null;
public ValueHolder() {
setValue(null);
}
public ValueHolder(final T newValue) {
setValue(newValue);
}
public T getValue() {
return value;
}
public void setValue(final T newValue) {
value = newValue;
}
}
然后在代码的顶部,将int x = 0替换为:
final ValueHolder<Integer> xHolder = new ValueHolder<Integer>(0);
在您的匿名班级的每个位置:
case 0:
System.out.println(position); // Prints out 0 Correct
xHolder.setValue(position);
...
case 1:
System.out.println(position); // Prints out 1 Correct
xHolder.setValue(position);
...
然后,当您想使用存储在持有人中的值时:
int storedX = xHolder.getValue();
编辑:添加一个观察者
创建以下界面:
public interface OptionObserver {
void notifyOptionChange(final int option);
}
然后使您需要将值发送到的另一个类,实现此接口。
然后,您的CustomWipeAdapter应该具有一个属性和一个setter:
OptionObserver optionObserver = null;
public void setOptionObserver(OptionObserver observer) {
optionObserver = observer;
}
然后在初始化期间,您调用setOptionObserver()
,将对其他类的实例的引用传递给它。
在您的CustomWipeAdapter中:
case 1:
System.out.println(position); //Outputs 1. Correct.
if(optionObserver != null) {
optionObserver.notifyOptionChange(position);
}
...
实际上,您正在做的是在侦听器中声明一个Java匿名类,实现将被调用的onClick
方法。 此封闭类的外部类具有不同的范围(它们与继承或友谊无关)。
现在, onClick
方法将被异步调用,因为onClick
是一个回调,即在发生其包含其类实例的事件注册时调用的方法。
当事件发生时,回调将更改x的值,因为x的值在其作用域旁边可见,但不在事件发生之前发生,并且不采用同步方式。
在一个简单的示例中这样想:
-你好杰克,我拿着一个空的咖啡杯。 (您在外部类中声明的x var)
-Hello Joe,当咖啡壶准备就绪时,我希望您填充咖啡杯(发生事件时,更改x的值)。
-你的杯子现在装什么? (在活动开始前打印x)
-什么都没有(0,逻辑)。
-不,不,错!
-嘿,但是咖啡壶还没做完。 咖啡机准备好时,我将其装满。
您应该做的是始终在事件发生后处理数据。 我建议您不要使用outter类的属性,而是在outter类中创建一个接受参数(要使用的变量)和其余代码的方法,并确保将调用此方法在您的回调中。 例如:
public class CustomSwipeAdapter extends PagerAdapter {
//Rest of code....
public void NotifyWhenClickOccurs(int x){
System.out.println(x);
//Use x here.
}
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
switch(position){
case 0:
System.out.println(position); // Prints out 0 Correct
//Notify your outter class instance.
Notify(position);
Log.d("Exercise", "Dumbell Press");
Intent intent0 = new Intent(CustomSwipeAdapter.this.ctx, AnalysisPage.class);
CustomSwipeAdapter.this.ctx.startActivity(intent0);
break;
//Rest of code.....
}
}
}
这类似于说:
-(乔)杰克,当我加满杯子时,我会告诉你,以便你可以喝咖啡。
观察者设计模式是一种很好的标准化方法,在这里您正在做类似的事情,将外部类以更草拟和更通用的方式视为“观察者”。
您应该考虑的另一件事是您在回调和通知方法内部做的事情(它们使用什么线程?它们可以从那里对GUI / Dispatch线程进行更改吗?),但这超出了问题的范围,仅是一些思考的食物。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.