Android - 从自定义视图中的 onTouch 方法向 mainActivity 发送信息

Android - send information to the mainActivity from the onTouch method in a Custom View

我有一个自定义视图 (DrawFigures),它有一个 onTouch 方法来执行一系列操作。有一个布局有几个按钮,一个 TextView 和一个 RelativeView 来动态添加自定义视图。然后,在 MainActivity.class 中,我需要在这个自定义视图中调用 onTouch 方法时接收 DrawFigures 中的一些属性的值,以便在 TextView 组件中显示它们。

这里是自定义视图的代码:

public abstract class DrawFigures extends View{
    private float value1;
    public boolean onTouch(Motion Event){
        int action = event.getAction();
        if(action==MotionEvent.ACTION_MOVE){
            // ... methods that provoke that value1 changes
        }else if(action==MotionEvent.ACTION_DOWN){
            // ...        
        }else if(action==MotionEvent.ACTION_UP){
            // ...
        }
    }
    // ...
    return true;
}

由于 DrawFigures 的 onTouch 方法,我无法在 MainActivity 的 TextView 中接收值 1 来显示它。这个问题怎么解决?在 MianActivity 中实现 OnTouch 方法?怎么做? MainActivity.class 看起来像这样:

public class MainActivity extends Activity implements View.OnTouchListener{
    DrawFigures fig;
    TextView txtInfo;
    // ...
    public void btnSecRec(View v){
        int id = v.getId();
        if (id == R.id.btnSecRec){
            RelativeLayout parent = (RelativeLayout)findViewById(R.id.viewDatosSec);
            parent.removeAllViews();
            fig = new DrawRectangleWithDimensions(this);
            fig.setOnTouchListener(this);
            fig.setFigure(10, 40);
            parent.addView(fig);
        }
    }
    public boolean onTouch(View v, MotionEvent event) {
        int action = event.getAction();
        if (action == MotionEvent.ACTION_MOVE) {

            if (fig.touching == true) {
                String value = Float.toString(fig.getChangingDimensionValue());

                txtInfo.setText(value);
            }
        }
        return true;
    }
}

您可以在 activity 中实现 onTouchListener,并在调用超级 class' onTouchEvent 之后,通过 getter 更新值。像这样:

@Override
public boolean onTouch(final View v, final MotionEvent event) {
    super.onTouchEvent(event)
    float value1 = fig.getUpdatedValues()
    return true;
}

记得在 activity

中为该视图分配 OnTouchListener

您可以像这样在非activity class 中将 value1 声明为静态。

static float value1;

然后像这样获取 Activity class 中的值:

public boolean onTouch(View v, MotionEvent event) {
    int action = event.getAction();
    String value = Double.toString(DrawFigures.value1);
    if (action == MotionEvent.ACTION_MOVE) {

        if (fig.touching == true) {
            String value = Float.toString(fig.getChangingDimensionValue());

            txtInfoc.setText(value);
        }
    }

或者由于您的值是私有的,您可以使用 settergetter 方法通过 DrawFigures 对象设置和检索值,然后您可以在整个应用程序中使用它。

如果你想让值持久化,可以使用SharedPreferences

经过一段时间的尝试,我找到了解决办法。只需使用 MainActivity 的 onTouch 方法中的实例 "fig" 调用 DrawFigures class 中的 onTouchEvent 方法。

我要感谢花时间帮助的人,谢谢!

代码如下:

public class MainActivity extends Activity implements View.OnTouchListener{
DrawFigures fig;
TextView txtInfo;
// ...
public void btnSecRec(View v){
    int id = v.getId();
    if (id == R.id.btnSecRec){
        RelativeLayout parent = (RelativeLayout)findViewById(R.id.viewDatosSec);
        parent.removeAllViews();
        fig = new DrawRectangleWithDimensions(this);
        fig.setOnTouchListener(this);
        fig.setFigure(10, 40);
        parent.addView(fig);
    }
}
public boolean onTouch(View v, MotionEvent event) {
    int action = event.getAction();
    fig.onTouchEvent(event);
    if (action == MotionEvent.ACTION_MOVE) {

        if (fig.touching == true) {
            String value = Float.toString(fig.getChangingDimensionValue());
            txtInfo.setText(value);
        }
    }
    return true;
}

}