如何改善Android Studio类与Processing sketch之间的交互

时间:2016-01-27 12:55:33

标签: android xml android-studio processing

我创建了一个应用,其中我的MainActivity上显示了处理草图:

package app.yeah.app;

        import android.app.Fragment;
        import android.app.FragmentManager;
        import android.support.v7.app.ActionBarActivity;
        import android.os.Bundle;
        import android.view.Window;
        import android.widget.TextView;

        public class MainActivity extends ActionBarActivity {

            TextView t1 = (TextView)findViewById(R.id.t1);
            //
            Fragment fragment;
            FragmentManager fragmentManager;

            //
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                this.supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
                setContentView(R.layout.activity_main);

                fragmentManager = getFragmentManager();
                fragment = new ProcMenu();
                fragmentManager.beginTransaction()
                        .replace(R.id.frag, fragment).commit();
            }
        }

通过使用片段,我显示处理草图:

package app.yeah.app;

import android.media.MediaPlayer;
import processing.core.PApplet;
import processing.core.PVector;

public class ProcMenu extends PApplet
{
    PVector cur;
    float r;
    public void setup()
    {
        //size(240, 400);
        smooth();
        r = width / 20;
    }
    public void draw()
    {
        background(0);
        cur = new PVector(mouseX, mouseY);

        fill(255, 0, 200, 200);
        noStroke();
        ellipse(cur.x, cur.y, r, r);

        fill(255, 200, 0);
        text("X: " + cur.x + ", Y: " + cur.y, r, r);
    }
}

草图很容易显示坐标,这很棒但是,我希望能够在我的MainActivity中访问这些变量,然后在textView t1上显示它。但是在变量没有更新的情况下,我不知道该怎么做。 textView位于布局上:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <FrameLayout android:id="@+id/frag"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
    </FrameLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/t1"
            android:layout_gravity="center_horizontal" />
    </LinearLayout>
</RelativeLayout>

非常感谢。

2 个答案:

答案 0 :(得分:2)

您需要将变量从ProcMenu类传递到MainActivity类。有两种方法可以做到这一点:

方法1:ProcMenu类中创建一个返回坐标的get函数,只要你想更新就从MainActivity类调用该函数。 / p>

public class MainActivity extends ActionBarActivity {

   TextView t1 = (TextView)findViewById(R.id.t1);
   ProcMenu fragment;

   public void updateText(){
      t1.setText(fragment.getCur().x + ", " + framgent.getCur().y);
   }
}

public class ProcMenu extends PApplet{
    PVector cur;

    public PVector getCur(){
       return cur;
    }
}

方法2 :在MainActivity班级中创建一个集合函数,然后将MainActivity的实例传递到ProcMenu班级。然后只需在需要更新时立即调用setter。

public class MainActivity extends ActionBarActivity {

   TextView t1 = (TextView)findViewById(R.id.t1);
   ProcMenu fragment = new ProcMenu(this);

   public void updateText(PVecotr cur){
      t1.setText(cur.x + ", " + cur.y);
   }
}

public class ProcMenu extends PApplet{
    PVector cur;
    MainActivity mainActivity;

    public ProcMenu(MainActivity mainActivity){
       this.mainActivity = mainActivity;
    }

    public PVector updateCur(){
       mainActivity.updateText(cur);
    }
}

你采取哪种方法完全取决于你。

答案 1 :(得分:0)

我使用Handler解决了这个问题,有代码:

活动:

声明和分配全局变量

public static Handler sender = null;        
Handler receiver = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        Log.e("Activity", "message received" + msg.obj);
        // Do Something.
    }
};

设置草图片段时:

PApplet sketch = new Sketch(receiver);

将数据发送到草图:

if (sender!=null)sender.obtainMessage(int what, Object data).sendToTarget();

素描:
声明和分配全局变量:

private static Handler mSender;

Sketch Constructor:

Sketch(Handler sender) {
        mSender = sender;
        SensorActivity.sender = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                Log.e("Sketch", "message arrived");
                // Do Something.                        
            }
        };
}

将数据发送到活动:

mSender.obtainMessage(int what, Object data).sendToTarget();