Android:在setContentView之后传递值给view



Android新手,在将数据从activity传递给view时遇到了一些麻烦。我有一个简单的Android onCreate方法我的活动。

public class MyActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = getIntent();
        int num = intent.getIntExtra(MainActivity.EXTRA_NUM, 0);
        setContentView(R.layout.play_game); //this is a MyView class inside of a LinearLayout
        //where I want to pass the value of num to MyView
        MyView myView = (MyView) findViewById(R.id.myview);
        myView.setNum(num);
    }
}

public class MyView extends View {
    protected int num;
    protected int[] array;
    public MyView(Context context) {
        super(context);
        init();
    }
    public MyView(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
        init();
    }
    protected void init() {
        setBackgroundResource(R.drawable.pic1);
        array = new int[num];
    }
    public void setNum(int num) {
        this.num = num;
    }
}

然而,我不知道如何传递一个值给MyView类(它扩展视图)。我只是想发送一个整数值,视图类将在开始构造函数之前得到。

  1. 为您的MyView类添加setter方法

    public void setNum(int num)
    {
        this.num=num;
    }
    
  2. MyActivity找到你的视图

    MyView myView=(MyView) findViewById(R.id.ID_OF_YOURS_VIEW_IN_ACTIVITYS_LAYOUT);
    
  3. 通过传递给setter方法将您的值设置为您的视图

    myView.setNum(num);
    

在MyActivity类的oncreate()中获得findViewById()的视图id

MyView mv=(MyView) findViewById(R.id.your-view-id); 

然后通过方法getdata()

设置该值
mv.getdata(value);

其中getdata()方法看起来像

public void getdata(int value)
{
  this.value=value;
}

after setContentView

MyView mv = (MyView) findviewById(R.id.myView);
mv.setData(int number);

你需要将setData设为public。确保用

设置myview的id
 android:id="@+id/myView"
在xml。

您有几个选择:

从init()中删除数组的初始化,或者像其他人建议的那样为避免错误给它一个默认值。这取决于具有默认值的数组在您的上下文中是否有意义。最后用setter注入数字。

您还可以定义一个静态方法,用于在调用视图构造函数之前从活动设置数字(在使用findViewById()膨胀视图之前进行)。但总的来说,这是一个不好的做法,应该在特定情况下使用。

真正的问题可能是:init()调用在构造函数中是否有意义,数组必须在视图构造时设置?之后不能初始化吗?

最新更新