android - 如何从上下文中获取视图?

lor*_*tol 52 android broadcastreceiver android-intent android-context

我想从Context获取视图或findViewById()?还是从意图?

我试图在我的广播接收器中到达特定视图,onReceive的参数是上下文和意图.

好吧,我有一个班级,其中是我的广播接收器.现在,我正在尝试将广播接收器与它分开,但我需要一种方法,这样我仍然可以从我的分离广播接收器类中与我的类上的视图进行通信.

谢谢.

小智 61

例如,您可以找到任何textView:

TextView textView = (TextView) ((Activity) context).findViewById(R.id.textView1);
Run Code Online (Sandbox Code Playgroud)

  • 好答案.这是2015年的做法,上述方式似乎非常多余. (3认同)

sam*_*mis 56

从上下文开始,可以通过相关活动的根视图

View rootView = ((Activity)_context).Window.DecorView.FindViewById(Android.Resource.Id.Content);
Run Code Online (Sandbox Code Playgroud)

在原始Android中,它看起来像:

View rootView = ((Activity)mContext).getWindow().getDecorView().findViewById(android.R.id.content)
Run Code Online (Sandbox Code Playgroud)

然后只需在此调用findViewById即可

View v = rootView.findViewById(R.id.your_view_id);
Run Code Online (Sandbox Code Playgroud)

  • 请记住,您应该将`View v = rootView.findViewById(R.id.your_view_id);`转换为`View v =(View)rootView.findViewById(R.id.your_view_id);`和类_View_可以是任何派生类观点. (3认同)
  • @drynyn那是因为这个例子假设正在为上下文传递一个Activity,这不是一个安全的假设.您可以使用instanceof关键字来检查演员表是否可以安全执行.(例如google"instanceof java"). (2认同)

Mar*_* S. 7

在您的广播接收器中,您可以通过膨胀从XML资源的根布局访问视图,然后使用findViewByid()从此根布局中查找所有视图:

View view = View.inflate(context, R.layout.ROOT_LAYOUT, null);
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过"查看"访问您的视图,并将其投射到您的视图类型:

myImage = (ImageView) view.findViewById(R.id.my_image);
Run Code Online (Sandbox Code Playgroud)

  • 不应该是'null`而不是`false`? (3认同)
  • 我不认为(重新)膨胀整个视图是一种非常有效或可靠的方法,因为它已经通过调用 setContentView() 膨胀了。但是,如果您省略对“setContentView()”的调用并在手动膨胀后手动附加它,那么您可能没问题(我忘记了具体如何执行此操作,但是可以在任何“Activity”或“Fragment”中完成手动视图附加`)。 (2认同)