0

MainActivity で作成した GridView を、私の場合は GameplayController という別のクラスから更新したいと思います。

具体的には、現在 MainActivity にある gridView.setOnItemClickListener(....)... を GameplayController クラスのメソッドに単純に挿入しようとしています。

私は小さなボード ゲーム アプリを作成しています。私は、ゲームが終了するまで実行されるゲームのループを持つメソッド「play()」を作成することを考えました。MainActivity の onCreate で GridView を起動し、次にゲームを実行したいメソッドを呼び出しますが、作成した GridView を GameplayController クラス メソッド "play()" に取得して、そこから直接適切に更新できるようにする方法がわかりません。

私の MainActivity の関連部分は次のとおりです。

...
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        GridView gridview = (GridView) findViewById(R.id.gridview);
        gridview.setAdapter(new ImageAdapter(this));

        //Create board model, add units to player's list.
        UnitArray gameBoardModel = new UnitArray();

        //Run the game loop until winner found.
        GameplayController.play();

        //This ClickListener I don't want here, I want it in my play() method.
        gridview.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int postion,
                    long id) {
                // Toast for development help only.
                Toast.makeText(MainActivity.this, "" + postion,
                        Toast.LENGTH_SHORT).show();
            }
        });

    }
...

GridView を制御したいクラスの関連部分は次のとおりです。

public class GameplayController {

    private static boolean gameOver = false;

    /*
     * Will run the game loop.
     */
    public static void play() { 
        while (gameOver == false) {
            /*
             * Update the GridView from Main somehow.
             */


            /*
            * Will be put in correct place later.
            /*
            gameOver = true;
        }
    }
}

これは完全に間違っているかもしれませんが、LayoutInflater を使用する必要がありますか?

4

2 に答える 2

2

それを機能させるために、私はしなければなりませんでした、

A: 「GameplayController」クラス内に Context、LayoutInflater、およびコンストラクターを作成します。

Context ctxt;
LayoutInflater myInflater;

public GameplayController(Context c){
    ctxt = c;
    myInflater = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

B: "play" メソッドを変更して、View を返し、View を引数として受け入れるようにします。

private static boolean gameOver = false;

/*
 * Will run the game loop.
 */
public View play(GridView gv) { 
    while (gameOver == false) {
        gv.setOnItemClickListener(new OnItemClickListener(){
            public void onItemClick(AdapterView<?> parent, View v, int position, long id){
                Toast.makeText(ctxt, "" + position, Toast.LENGTH_SHORT).show();
                ImageView img = (ImageView)v;
                img.setImageResource(R.drawable.rock1select);
            }
        });
        return(gv);
    }
    return gv;
}

}

C: 「MainActivity」に「GameplayController」オブジェクトを作成し、その Context を引数として渡します。次に、"play" メソッドを呼び出し、Main で作成されたビューを渡します。

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState){

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    GridView gridview = (GridView) findViewById(R.id.gridview);
    gridview.setAdapter(new ImageAdapter(this));

    GameplayController gc = new GameplayController(this);

    //Create board model, add units to player's list.
    UnitArray gameBoardModel = new UnitArray();

    //Run the game loop until winner found.
    gc.play(gridview);

}

私のような初心者の参考のために、メインで使用されているインポートステートメントを次に示します。

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.GridView;

そして、私の「GameplayController」にあるものは、Image/GridView コントローラー/アダプターのように機能します。

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Toast;
于 2013-04-25T11:18:31.393 に答える
0

アクティビティ (またはむしろグリッド) をパラメーターとしてメソッドに渡しますplay

playしかし、これは無限ループであり、A/ まったく到達gridview.setOnItemClickListenerせず、B/ 数秒で ANR が発生するような方法で UI スレッドをブロックしていることがわかります。

ゲームがリアルタイムの場合、ゲーム ループを別のスレッドに配置し、メッセージをハンドラーに投稿してビューを更新する必要があります (ハンドラー、ルーパー、AsyncTask を参照)。

ゲームがターン ベースの場合は、必要なときにのみビュー更新ルーチンを呼び出す必要があります。ループは使用しません。

于 2013-04-24T10:07:10.677 に答える