2

I need to setImageResource in Activity A's ImageView after clicking a button in Activity B. I'm trying to do this creating a public static ImageView.

Here's the code of Activity A:

public class ActivityA extends Activity {

public static ImageView image;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_activityA);

    image = (ImageView) findViewById(R.id.image);

}

Here's the code of Activity B:

button.setOnClickListener(new OnClickListener() {


        @Override
        public void onClick(View button) {

            if(editText.getText().toString().equalsIgnoreCase("myText")) {
                ActivityA.image.setImageResource(R.drawable.other_image);

            Intent act2= new Intent(ActivityB.this,ActivityA.class);
                startActivity(act2);    
            }




        }); 
}

I can't understand why my App crashes after button is clicked (it works if I remove "activityA.image.setImageResource(R.id.other_image)" ) so the problem must be here. Should I write something else in ActivityA.class? Thank you for every possible solution and sorry for my bad english.

4

5 回答 5

1

你可以这样做:

public class ActivityA extends Activity {

public static ImageView image;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_activityA);

image = (ImageView) findViewById(R.id.image);
image.setImageResource(getIntent().getIntExtra("myImageResource",R.drawable.default_image);
}

*注意:我使用 R.drawable.default_image 以防找不到“myImageResource”

button.setOnClickListener(new OnClickListener() {


    @Override
    public void onClick(View button) {


        Intent act2= new Intent(ActivityB.this,ActivityA.class);
            act2.putExtra("myImageResource", R.drawable.other_image);
            startActivity(act2);    
        }




    }); 
 }
于 2013-09-24T18:02:20.443 回答
0

LogCat 将有助于理解您的问题,但我建议您删除静态值并在 Intent 上尝试 PutExtra,因为据我所知,您不能像您那样直接在两个单独的活动之间发送或操作数据。所以

private ImageView image; 

关于活动 A

并且在 B

act2.putExtra("myImageResource", R.drawable.other_image);

如果捆绑包存在,不要忘记签入活动 A

Intent intent = new Intent();
    intent = getIntent();
    Bundle bundle = intent.getExtras();

    if (bundle != null) {...}
于 2013-09-24T18:21:36.750 回答
0

当您遇到应用程序崩溃时,您应该始终为其发布 logCat。不过,我的猜测是您遇到了空指针异常,因为 ActivityA.image 的某些部分为空。

无论如何,这不是从 Activity B 更改 Activity A 的最佳方式。请记住,当 Activity B 在前台时,Activity A 不可见。只有当 Activity A 进入前台时,才能对 Activity A 的 UI 进行更改。因此,您真正要做的是更改 Activity A 的状态,而不是其 UI。要跟踪 Activity A 的状态,请使用持久存储 (SharedPreferences) 或其他一些应用范围的存储。当 Activity A 在 onResume() 中返回前台时,如有必要,请修改 UI 以反映当前状态。

显示应用程序的瞬时状态而不是其初始状态是大多数 UI 更新应该在 onResume() 而不是 onCreate() 中的原因。同样,始终将 Activity 的状态保存在 onPause() 中。

最后,在 Android 中,您应该避免使用公共全局变量在组件(活动、服务、内容提供者和广播接收器)之间传递数据。相反,使用 Intent 或持久存储。

于 2013-09-24T18:05:29.530 回答
0

不要那样做。对视图的静态引用将使整个 Activity 保持活跃。一旦一个活动停止,它就可以被系统杀死。

根据您要执行的操作,您可以将资源 id 作为额外的意图传递给 ActivityA 的新实例,或者在启动 ActivityB 时使用 startActivityForResult,然后在 ActivityA 中实现 onActivityResult。

于 2013-09-24T18:01:08.547 回答
0

您正在尝试更改活动 B 中活动 A 的图像。活动 B 不会放大您的活动 A 的视图。活动 B 中不存在它。那么肯定会引发异常,因此应用程序崩溃。而是通过使用 put extra 从活动 B 到 A 的额外值。使用 getIntent.getExtras() 签入活动 A。如果它有一些价值,那么改变活动A的形象

于 2013-09-24T18:20:17.673 回答