【问题标题】:Pass data from class to activity将数据从类传递到活动
【发布时间】:2012-11-10 16:39:53
【问题描述】:

我有一个活动和一个扩展的 View 类,它们都使用相同的 xml 布局。在扩展视图中,我通过触摸在屏幕上绘制了一些绘图,并且希望在用户点击屏幕时将触摸的坐标 x 传递给 Activity。

到目前为止,我使用了一个 getter 方法并从 Activity 内部调用它,但它只传递了构造函数 X 的初始化值,而不是用户触摸的实际 X 坐标。

我很确定我错过了什么。能给我指路吗?

编辑: 正如建议的那样,我尝试使用公共接口而不是 getter 实践,但 X 仍然没有改变。这是我的代码:

我的自定义类:

public class ImageView1 extends View  {

 Context context;

 ArrayList<ViewWasTouchedListener> listeners = new 
                                   ArrayList<ViewWasTouchedListener>();
 ImageView1 img = (ImageView1) findViewById (R.id.imageView1);

 public float x=0;
 public float y=0;

 public ImageView1(Context context) {
        super(context);
        this.context=context;
        setFocusable(true);
    }


public ImageView1(Context context, AttributeSet attrs) {
    super(context, attrs); 
    this.context=context;
    setFocusable(true);

} 

@Override
public boolean onTouchEvent(MotionEvent event){
        switch (event.getAction()){
        case (MotionEvent.ACTION_DOWN): {

                 x = event.getX();
                 y = event.getY();
     for (ViewWasTouchedListener listener:listeners){
         Log.d("Touchpoint", String.valueOf(x) +"," + String.valueOf(y));
         listener.onViewTouched(x);
        }
    }

    return true;

   }  

@Override
public void onDraw(Canvas canvas){
    super.onDraw(canvas);

    ....
}

public void setWasTouchedListener(ViewWasTouchedListener listener){
    listeners.add(listener);
}   
}

我的主要活动:

 public class TargetPractise extends Activity implements ViewWasTouchedListener  {
 @Override

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.target_form);

    ImageView1 value = new ImageView1(TargetPractise.this);
    value.setWasTouchedListener(TargetPractise.this);   

 }

  public void onViewTouched(float x){
     Log.d("x",String.valueOf(x));

  }   
  }

我的界面:

  public interface ViewWasTouchedListener {
void onViewTouched(float x);
 }

我的 xml 布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical" >

 <android.archer.test.ImageView1
  android:id="@+id/imageView1"
  android:layout_width="300dip"
  android:layout_height="300dip"
  android:layout_gravity="center_horizontal"
  android:background="@drawable/target" >
</android.archer.test.ImageView1>

【问题讨论】:

  • ImageView1 img = (ImageView1) findViewById (R.id.imageView1);看起来很奇怪。我很惊讶你没有得到例外
  • 这里没有例外。我已经添加了我的 xml 文件,希望能让事情更清楚
  • 我已经整理好了。非常感谢您的帮助:)
  • 好消息。很高兴它正在工作。你应该接受我或你的回答。楚斯。

标签: java android interface touch getter


【解决方案1】:

定义一个接口并使用回调让活动知道 x 已更改。我喜欢这种方法,因为它适用于任何有兴趣知道 x 何时发生变化的班级,而不仅仅是您的活动。想象一下,您添加了一种新类型的视图类,但它还需要知道您的自定义视图何时被触摸(我使用图形以及可以拖动的水平和垂直刻度来执行此操作 - 刻度告诉任何感兴趣的人他们已经改变) .

public Interface ViewWasTouchedListener {
    void onViewTouched(float x);
}

在您的自定义视图中

ArrayList<ViewWasTouchedListener> listeners = new ArrayList<ViewWasTouchedListener>();

...

public void setWasTouchedListener(ViewWasTouchedListener listener){
    listeners.add(listener);
}

在你的触摸事件中

for (ViewWasTouchedListener listener:listeners){
   listener.onViewTouched(x);
}

在您的活动中:

public class Test extends Activity implements ViewWasTouchedListener {

...

@Override
public void onCreate(Bundle savedInstanceState) 
{
    ...
    MyExtendedView customView = (MyExtendedView)findViewById(R.id.myCustomeView);
    customView.setWasTouchedListener(this);
    ...
}

public void onViewTouched(float x){
   // do whatever you need to do
}

全部来自记忆,所以请原谅拼写错误,您应该通过添加 removeViewWasTouchedListener 并检查您没有在 setViewWasTouchedListener 中添加两次相同的侦听器来改进视图类。

您可能也需要 y,因此只需将其添加到接口定义中即可。

【讨论】:

  • 根本没有错别字:) 这很奇怪,但 X 似乎仍然没有改变。我完全按照你的建议做了。
  • X 在您的触摸事件或活动监听器中没有变化?
  • 实际上 X 在触摸事件中正常变化,但主活动中的 public void onViewTouched(float x) 从未被调用。我应该使用代码 sn-p 编辑我的帖子吗?
  • 请。你确定你在活动声明中添加了“实现 ViewWasTouchedListener 吗?
【解决方案2】:

你应该重写 onTouch() 试试这个,

   @Overrride
   public boolean onTouch(View v, MotionEvent event) {

   int xPoint = event.getX();
   int yPoint = event.getY();
   return true;
   }

【讨论】:

    【解决方案3】:

    在获得一些帮助并更改了一些内容后,我的代码可以完成我想做的事情:

    我的活动:

     public class TargetPractice extends Activity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
    
                final View viewMain; 
    
                setContentView((viewMain = View.inflate(this, R.layout.main, null))); 
    
                new MyImageView(this, viewMain,
                                new TargetInterface() {
    
                                        @Override
                                        public void OnTouchEventDown(float x, float y) {                                                
                                                Log.w("MYPRG", String.format("%f, %f", x, y));
                                        }
                                });
        }        
     }
    

    我的自定义类:

      public class MyImageView extends View implements View.OnTouchListener {
    
        Context context;
    
                private TargetInterface iTarget = null;
    
                public float x=0;
                public float y=0;                       
    
                public float getx() { 
                  return this.x;
                                 }
    
                public MyImageView(Context context, View view, TargetInterface iTarget) 
                {
                                super(context);
                                this.context=context;                           
                                this.iTarget=iTarget;   // bind TargetInterface
    
                                setFocusable(true);
                                view.setOnTouchListener(this);
                }               
    
                @Override               
                public boolean onTouchEvent(MotionEvent event)  
                {
                        switch (event.getAction())
                        {
                                  case MotionEvent.ACTION_DOWN: 
                                  {
                                                x = event.getX();
                                                y = event.getY();
    
    
    
                                                return true;
                                  }                               
                        }
    
                   return false;
                }
                    @Override
                    public void onDraw(Canvas canvas){
                    super.onDraw(canvas);
    
                     ....
                  }
              public boolean onTouch(View v, MotionEvent event) {
                  x = event.getX();
                  y = event.getY();
                 iTarget.OnTouchEventDown(x, y);
                return false;
    }                               
       }
    

    我的界面:

        public interface TargetInterface {
    
              public void OnTouchEventDown(float x, float y);
    
        }   
    

    【讨论】:

      猜你喜欢
      • 2011-12-14
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      相关资源
      最近更新 更多