将变量从参数中的一个类发送到另一个类。简单的错误

时间:2015-09-01 23:33:58

标签: java

我想发送给另一个类的变量是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方法,但它们仍然不起作用。

2 个答案:

答案 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线程的更改吗?),但这超出了问题的范围,只是一些值得思考的东西。