我想发送给另一个类的变量是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始终是输出。 (参见代码中的示例)。
最终,我希望位置变量在另一个类中,但输出始终为0.我尝试过Getter / Setter方法,但它们仍然不起作用。
答案 0 :(得分:0)
匿名类只能访问封闭类的最终变量。为了解决这个问题,请将以下类(在单独的文件中)添加到项目中:
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应具有属性和设置器:
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);
}
...
答案 1 :(得分:0)
您实际执行的操作是在侦听器中声明Java匿名类,并实现将被调用的onClick
方法。这个封闭类的范围与其外部类不同(它们与继承或友谊无关)。
现在,onClick
方法将被异步调用,因为onClick
是一个回调,即当一个事件发生时调用其包含类实例的方法。
当事件发生时,回调将更改x的值,因为它在其范围旁边可见,但在事件发生之前不是,而不是以同步方式。
在一个简单的例子中这样想:
-Hello Jack,我拿着一个空的咖啡杯。 (你的x var在outter类中声明)
-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.....
}
}
}
这类似于说:
- (乔)杰克,当我装满我的杯子时,我会告诉你的,这样你就可以喝我的咖啡了。
这样做的一个很好的标准化方法是Observer设计模式,你在这里做类似的事情,把外面的阶级视为一个观察者&#34;以更多的草案和一般方式。
你应该考虑的另一件事是你在回调中做了什么并通知方法(他们使用什么线程?他们可以从那里执行对GUI / Dispatch线程的更改吗?),但这超出了问题的范围,只是一些值得思考的东西。