簡體   English   中英

Android:將數據從Java文件傳遞到活動

[英]Android: Passing data from Java file to an activity

我有一個Java文件,其中包含在活動Java中調用的Java函數。 但是我不知道如何將一些數據從Java函數文件傳遞到活動Java,以便可以在應用程序中顯示它們。

Java函數文件(FaceView.java)中的一些編碼

public class FaceView extends View {

private FaceListener mFaceListener;

interface FaceListener {
     void handleData(int[] cxArr, int[] cyArr);    
}

public void setFaceListener(FaceListener faceListener) {
    this.mFaceListener = faceListener;
}

private int cx;
private int cy;
private int[] cxArr;
private int[] cyArr;

private void drawFaceAnnotations(Canvas canvas, double scale) {
    for (int i = 0; i < mFaces.size(); ++i) {
        Face face = mFaces.valueAt(i);

        for (Landmark landmark : face.getLandmarks()) {
            cx = (int) (landmark.getPosition().x * scale);
            cy = (int) (landmark.getPosition().y * scale);
            canvas.drawCircle(cx, cy, 5, paint);
            cxArr[i] = cx;
            cyArr[i] = cy;
            mFaceListener.handleData(cxArr,cyArr);
        }
}
    }
}

Activity java文件(DisplayActivity.java)中的代碼

 overlay.setFaceListener(new FaceView.FaceListener() {
 public void handleData(int[] cxArr, int[] cyArr) {

 System.out.println(cxArr[1]+" "+cyArr[1]);
     }
  });

有人知道如何將數據從FaceView.java傳遞到DisplayActivity.java嗎? 我嘗試了打算/捆綁,但似乎沒有用。 謝謝

您需要從視圖到活動的回調。

將接口添加到View實現中,並在需要時調用它:

public class FaceView extends View {

    private FaceListener mFaceListener;

    interface FaceListener {
        public void handleData(Integer[] cxArr, Integer[] cyArr);
    }

    public void setFaceListener(FaceListener faceListener) {
        this.mFaceListener = faceListener;
    }


    private void drawFaceAnnotations(Canvas canvas, double scale) {
        // your code here
        // notify listener

       List<Integer> cxList = new ArrayList<Integer>();
       List<Integer> cyList = new ArrayList<Integer>(); 

       for (int i = 0; i < mFaces.size(); ++i) {
           Face face = mFaces.valueAt(i);

           for (Landmark landmark : face.getLandmarks()) {
                cx = (int) (landmark.getPosition().x * scale);
                cy = (int) (landmark.getPosition().y * scale);
                canvas.drawCircle(cx, cy, 5, paint);

                cxList.add(cx);
                cyList.add(cy);

            }
        }

        Integer[] cxArr = cxList.toArray(new Integer[cxList.size()]);
        Integer[] cyArr = cyList.toArray(new Integer[cyList.size()]);

        mFaceListener.handleData(cxArr,cyArr);
    }
}

在您的活動中設置回調/接口:

public class DisplayActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // your code here
        FaceView overlay = (FaceView) findViewById(R.id.faceView);
        overlay.setFaceListener(new FaceView.FaceListener(){
             public void handleData(int[] cxArr, int[] cyArr) {
                 // TODO: handle faces array here
             } 
        });
    }
}

您可以在FaceView類中簡單地使用getter方法。 由於您在DisplayActivity有對該類的引用,因此可以簡單地調用此方法來傳遞數據。

因此,從您的評論開始,您需要傳遞cxcy 我認為這些是int坐標。 由於您只能在java方法中返回一個值,而您只有兩個值,因此我正在使用Point 但是您可以使用ArrayArrayList 執行以下操作。

FaceView.java

 private int cx;
 private int cy;

 public Point getCoordinates(){
       return new Point(cx, cy);
 }

DisplayActivity.java

 final Point point = overlay.getCoordinates();
 int cx = point.x;
 int cy = point.y;

passing data from FaceView to DisplayActivity技術上講passing data from FaceView to DisplayActivity這不是passing data from FaceView to DisplayActivity ,而是fetching data of FaceView from DispalyActivity 如果您足夠,則可以使用此方法。 我從您的評論中建議這樣The reason for the data passing is that I will create a text view to display the data on the app

另一方面,如果要立即通知DisplayActivity FaceView的更改,則需要通過創建iterface為其設置偵聽器(請參閱DevrimTuncer的答案)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM