如何从另一个类的MainActivity修改View?

时间:2013-04-24 09:51:39

标签: android android-gridview layout-inflater

我想在另一个类中更新我在MainActivity中创建的GridView,在我的例子中,称为GameplayController。

具体来说,我试图简单地将gridView.setOnItemClickListener(....)...我目前在MainActivity中插入到GameplayController类的方法中。

我正在制作一个小桌面游戏应用程序,我想创建一个方法," play(),游戏循环直到游戏结束。我在MainActivity的onCreate中启动了GridView,然后我调用了我希望游戏运行的方法,但是我不知道如何将我创建的GridView转换为我的GameplayController类方法"播放()"这样我就可以直接从那里更新它。

以下是我的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吗?

2 个答案:

答案 0 :(得分:2)

为了让它发挥作用我必须,

答:在我的“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中创建的View。

公共类MainActivity扩展了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;

答案 1 :(得分:0)

将活动(或网格,而不是)作为参数传递给play方法。

但是,你会发现你的play是一个无限循环,并且A /你永远不会到达gridview.setOnItemClickListener而B /你正以某种方式阻止UI线程在几秒钟内得到一个ANR。

如果您的游戏是实时的,您需要将游戏循环放在另一个线程中并在处理程序上发布消息以更新视图(请参阅Handler,Looper,AsyncTask ......)

如果您的游戏是基于回合制的,则只需在需要时调用视图更新例程,无需循环。