1

基本的に、ビューがボタンとサーフェス ビューで構成されるシステムを実装しています。このサーフェス ビューは、メイン アクティビティのクラス内でプログラムによって定義されます。これを独自のタグとして xml ファイルの一部として追加する必要があります。

現在の xml コードは次のとおりです。

<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"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

   <Button
        android:id="@+id/downbutton"
        android:layout_width="100dip"
        android:layout_height="75dip"
        android:layout_alignLeft="@+id/upbutton"
        android:layout_centerVertical="true"
        android:text="Down" />

    <Button
        android:id="@+id/rightbutton"
        android:layout_width="100dip"
        android:layout_height="75dip"
        android:layout_alignBottom="@+id/leftbutton"
        android:layout_marginLeft="80dp"
        android:layout_toRightOf="@+id/upbutton"
        android:text="Right" />

    <Button
        android:id="@+id/leftbutton"
        android:layout_width="100dip"
        android:layout_height="75dip"
        android:layout_above="@+id/downbutton"
        android:layout_marginRight="80dp"
        android:layout_toLeftOf="@+id/upbutton"
        android:text="Left" />

    <Button
        android:id="@+id/upbutton"
        android:layout_width="100dip"
        android:layout_height="75dip"
        android:layout_above="@+id/rightbutton"
        android:layout_centerHorizontal="true"
        android:text="Up" />

    <com.example.gui.GridSurfaceView
        android:id="@+id/gridsurfaceview"
        android:layout_width="fill_parent"
        android:layout_height="300dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:background="#cbfff4" />

</RelativeLayout>

ここで、「com.example.gui.GridSurfaceView」はサーフェス ビュー クラスを指します。ただし、サーフェス ビュー クラスはメイン アクティビティのクラス内に配置されており、削除できません (サーフェス ビュー クラスでは、そのアクティビティからのいくつかの変数にアクセスする必要があるため)。サーフェス ビューに独自のクラスがある場合、ビューは正常に表示されましたが、現在、この xml がいくつかの問題を引き起こしています。xml を変更してサーフェス ビューを再度含めるにはどうすればよいですか?

編集 - さて、尋ねられたので、ここにもアクティビティコードがあります。コードが大きすぎるため、サーフェス ビューを含むアクティビティの一部を含めました。メイン アクティビティの名前は「Robotremote」で、SurfaceView は「GridSurfaceView」であることに注意してください。

public class GridSurfaceView extends SurfaceView implements Runnable {

SurfaceHolder GridSurfaceHolder;
Thread gridThread = null;
boolean isRunning = false;
Paint paint;
Typeface mFont = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD);
Paint red;

public GridSurfaceView(Context context) {
    // TODO Auto-generated constructor stub
    super(context);
    paint = new Paint();
    paint.setTextSize(14);
    paint.setTypeface(mFont);
    paint.setAntiAlias(true);
    red = new Paint();
    red.setColor(getResources().getColor(R.color.position));
    GridSurfaceHolder = getHolder();
    gridThread = new Thread(this); //allows for the usage of the run method of     this class. 
    gridThread.start();
}

public void pause(){
    isRunning = false;
    while(true){
        try {
            gridThread.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        break;
        }
        gridThread = null; 
}

public void resume(){
    isRunning = true;
    gridThread = new Thread(this);
    gridThread.start();
}

@Override
public void run() {
    // TODO Auto-generated method stub
    while(isRunning){
        if(!GridSurfaceHolder.getSurface().isValid())
            continue;

        Canvas gridcanvas = GridSurfaceHolder.lockCanvas();
        gridtobedrawn = com.example.gui.Robotremote.getGrid();
        paint.setColor(Color.BLACK);
        paint.setStrokeWidth(3);
        gridcanvas.drawRect(130, 130, 180, 180, paint);
        gridtobedrawn.draw(gridcanvas, paint);
        gridcanvas.drawCircle(xCoord, yCoord, (30*0.45f), red);

    }

}

}
4

2 に答える 2

1

この問題を解決するには、次のようにします。

カスタム ビューでリスナー インターフェイスを定義し、リスナー セッターを定義します。アクティビティの onCreate メソッドで view をプルし、それを GridSurfaceView にキャストし、インターフェイス リスナーを実装する匿名クラスを追加します (ボタンの setOnCLickListener など)。

インターフェイスの実装では、アクティビティの任意のフィールドを使用できます

--------------------------------------------------------------------

EDIT

リスナーを使用して GridSurfaceView を切り離し、ビューに xCoord と yCoord を挿入して、GridSurfaceView を Activity から分離できるようにします。

  1. xCoord 、 yCoord インジェクションを処理するために、GridSurfaceView でインターフェイスを定義します。

    public interface CoordsProvider {
        public double getXCoord();
        public double getYCoord(); // am assuming your xCoord and yCoord are doubles
    }
    
  2. GridSurfaceView でフィールド プロバイダーを定義する

    CoordsProvider provider;
    
  3. GridSurfaceView でプロバイダーのセッターを定義する

     public void setCoordsProvider(CoordsProvider p){
          provider = p;
     }
    
  4. run メソッドで、xCoords と yCoords を直接使用する代わりに、次のように coords プロバイダーを呼び出します。

    gridcanvas.drawCircle(provider.getXCoord(), provider.getYCoord(), (30*0.45f), red);
    
  5. GridSurfaceView コンストラクターを変更して、xml からインフレートできるようにします。コンストラクターにパラメーターを追加するだけです。

     public GridSurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
    ...//same code
    
  6. 投稿で行ったように、GridSurfaceViewをxmlレイアウトファイルに入れます

  7. findViewById を使用して setContentView の後にアクティビティの onCreate メソッドでプルします。

     @Override
    protected void onCreate(Bundle savedInstanceState)  {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout_id);
        gridSurfaceView = (GridSurfaceView) findViewById(R.id.gridsurfaceview);
    
        gridSurfaceView.setCoordsProvider(new CoordsProvider(){
            @Override
            public double getXCoord(){return xCoord;}
    
            @Override
            public double getYCoord(){return yCoord;}
        });
    
于 2013-09-26T17:46:01.293 に答える
0

内部クラスとして配置されている場合、カスタム ビューを定義することはできません。独立している必要があり、カスタム ビューをインスタンス化するには、アクティビティ全体をインスタンス化する必要があると考えてください。

XML に FrameLayout または ViewStub プレースホルダーを配置し、カスタム ビューをプログラムで拡張することをお勧めします。

于 2013-09-26T17:33:23.783 に答える