根据先前活动的整数更改视图

时间:2012-11-07 02:35:45

标签: android android-layout android-intent

我正在尝试根据用户在之前的活动中拖拽哪个视图来更改某个活动,但我的代码中出现了一些问题并拒绝使用。

整数存储为public static int _id,并为每个视图设置整数,如下所示:

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(150, 50);
layoutParams.leftMargin = 250;
layoutParams.topMargin = 250;
layoutParams.bottomMargin = -250;
layoutParams.rightMargin = -250;
_view.setLayoutParams(layoutParams);
_view.setOnTouchListener(this);
_view.setId(1);

然后通过此代码片段将整数发送到下一个活动。

       case MotionEvent.ACTION_UP:  
        _id = view.getId();
        Intent intent = new Intent(MainActivity.this, Exit_Activity.class);
        intent.putExtra("smiley", _id);
        startActivity(intent);

然后理论上应该在下一个活动中收到它,并定义屏幕顶部可见的视图。

public class Exit_Activity extends Activity {
ImageView _view;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_exit_);
    getActionBar().setDisplayHomeAsUpEnabled(true);
    Intent Intent = getIntent();
    int intValue = Intent.getIntExtra("smiley", 0);

    ImageView img = new ImageView(this);
    img.setImageResource(R.drawable.smile);    
if (intValue == 1) {img.setImageResource(R.drawable.smile);}
else if (intValue == 2) {img.setImageResource(R.drawable.frown);}
 }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_exit_, menu);
    return true;
}

现在,无论拖动什么视图,它似乎都无法做任何事情。任何意见都将不胜感激。

编辑:

对于奖金布朗尼积分,我正在尝试对文本做同样的事情,它看起来有点像这样:

    TextView textView = (TextView) findViewById(R.id.DynRes);
setContentView(R.id.DynRes);
if (intValue == 1) {DynRes.setText("Good to hear! have a nice day!");}
else
    if (intValue == 2) {DynRes.appendText("We're very sorry, we'll try harder next time!");}

}

我在eclipse中遇到一个错误,说“DynRes无法解决”,我不清楚为什么。再次感谢。

3 个答案:

答案 0 :(得分:2)

传递额外数据看起来是正确的。打印您收到的价值,看看你得到了什么。 并使用

将您的图像添加到任何父级
parent.addView(img);

答案 1 :(得分:2)

它没有做任何事情的原因是因为你没有抓住现有的ImageView并对其进行操作(例如通过findViewById())。相反,你只是创建一个新的ImageView。您需要获取现有的imageview或将新创建的视图添加到contentview的视图组。

编辑:

您对如何设置Activity的内容视图以及通过id查找视图的内容有一个基本的误解。

  1. 您的每个活动都有一个主要内容视图。您可以通过调用setContentView并传入其中一个布局的ID(R.layout.somelayout)来在onCreate中设置它。您传入的整数id只是一个位于名为R.java的自动生成类内部的公共静态int。该类内部是多个嵌套的静态类,例如public static final class layoutpublic static final class id。 Android资产包装工具(aapt)获取您的应用程序资源文件(以XML定义的东西)并编译它们,以便您可以在代码中引用它们。因此,例如,没有名称为Dynres的类型或变量等。所有这些都是一个公共int,你可以引用为R.id.Dynres。但是,您可以将int视为xml资源的编译表示。这让我想到了下一点。
  2. findViewById是一个可以搜索某个ViewGroup内部的方法(viewgroup是一个可以容纳其他子节点的视图,比如linearlayout或relativelayout(与TextView和其他不包含子节点的小部件相对))来查找子节点查看您传入的ID的内容。因此,例如,如果您引用了某个View,则可以调用someView.findViewById(R.id.someId),它将尝试在该视图的任何位置查找具有该ID的视图层次结构。如果在该视图中没有带有该id的视图,则返回null。现在,您还可以在Activity中调用findViewById,它只是在您为该子视图设置为Activity的contentView的布局内部进行搜索。因此,例如,如果您设置Activity的contentview,如setContentView(R.layout.mylayout),mylayout.xml是一些linearlayout,其内部有一个id为'my_textview'的textview,那么你可以执行findViewById(R .id.my_textview)。好的,这很好找到了视图,但是现在,实际上有一个TextView 对象,就像你可以使用的Java对象一样,并且作为TextView调用方法,你需要将该视图转换为TextView 。因此,TextView tv = (TextView)findViewById(R.id.my_textview)只是使用id来查找该视图,然后将其转换为分配给变量“tv”的TextView类型的对象,所以现在tv是您需要用来调用方法等等。所以,您的代码需要beDynRes.setText("Good to hear! have a nice day!")
  3. 您不希望将contentview设置为textview。 contentview应该是在包含textview的xml布局中定义的一些ViewGroup。

答案 2 :(得分:0)

如果您在Exit_Activity中有布局,则可以使用(layout).addView(img);或其他父母,如Sean John所说。 否则,您可以使用this.AddContentView(img,new LayoutParams(...));

将其添加到活动中