Android - 如何访问在 onResume 中的 onCreate 中实例化的 View 对象?

Posted

技术标签:

【中文标题】Android - 如何访问在 onResume 中的 onCreate 中实例化的 View 对象?【英文标题】:Android - How can I access a View object instantiated in onCreate in onResume? 【发布时间】:2011-01-17 18:26:27 【问题描述】:

在我的onCreate() 方法中,我正在实例化一个ImageButton 视图:

public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_post);

    final ImageButton ib = (ImageButton) findViewById(R.id.post_image);
...

onResume 中,我希望能够通过以下方式更改ImageButton 的属性:

@Override
protected void onResume() 
    super.onResume();
    ib.setImageURI(selectedImageUri);

onResume 无权访问ib ImageButton 对象。如果这是一个变量,我会简单地将其设为类变量,但 android 不允许您在类中定义 View 对象。

关于如何做到这一点的任何建议?

【问题讨论】:

你不能在 onResume 中使用 findViewById 吗? 【参考方案1】:

我会将图像按钮设为实例变量,然后您可以根据需要从这两种方法中引用它。 IE。做这样的事情:

private ImageButton mImageButton = null;

public void onCreate(Bundle savedInstanceState) 
  Log.d(AntengoApplication.LOG_TAG, "BrowsePicture onCreate");
  super.onCreate(savedInstanceState);
  setContentView(R.layout.layout_post);

  mImageButton = (ImageButton) findViewById(R.id.post_image);
  //do something with mImageButton


@Override
protected void onResume() 
  super.onResume();
  mImageButton = (ImageButton) findViewById(R.id.post_image);
  mImageButton.setImageURI(selectedImageUri);

尽管实例变量在 Android 中相对昂贵,但值得牢记的是,如果只在一个地方使用,在方法中使用局部变量会更有效。

【讨论】:

是的,这行得通。我错误地认为这在 Android 中不起作用,因为我在 onCreate 之前一直在关闭。原来,我的错误是我有: ImageButton ib = (ImageButton) findViewById(R.id.post_image);那个领先的“ImageButton”是罪魁祸首。谢谢。 为什么实例变量在Android中相对昂贵。第一次听说,Performance Tips (developer.android.com/training/articles/perf-tips.html) 没提...【参考方案2】:

findViewById() 不创建视图,它只是查找已经创建的视图。它是通过扩展上一行中的布局 R.layout.layout_post 创建的。

您可以简单地在您的onResume() 方法中调用findViewById() 以在该方法中获取对它的引用,或者您可以将ib 更改为一个实例变量,以便它可以在onCreate() 以外的方法中访问。

【讨论】:

【参考方案3】:

将声明从方法移到类。假设selectedImageUri 在范围内...

public class MyApp extends Activity 
    ImageButton ib;

    @Override
    public void onCreate(Bundle savedInstanceState) 
        Log.d(AntengoApplication.LOG_TAG, "BrowsePicture onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_post);

        ib = (ImageButton) findViewById(R.id.post_image);
    

    @Override
    protected void onResume() 
        super.onResume();
        ib.setImageURI(selectedImageUri);
    

【讨论】:

以上是关于Android - 如何访问在 onResume 中的 onCreate 中实例化的 View 对象?的主要内容,如果未能解决你的问题,请参考以下文章

Android 必知必会:自定义 View 可以知道 onPause/onResume 被调用了吗?

Android 必知必会:自定义 View 可以知道 onPause/onResume 被调用了吗?(不依赖Lifecycle)

requestLocationUpdates无限地回忆onPause和onResume

android的adapter能不能在onResume方法中创建

由于onResume,Android重复列表视图

Android 9.0:不允许启动服务:应用程序在后台.. onResume() 之后