【问题标题】:android - How to get view from context?android - 如何从上下文中获取视图?
【发布时间】:2012-10-18 08:58:54
【问题描述】:

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

我正在尝试在广播接收器中访问特定视图,而 onReceive 的参数是上下文和意图。

嗯,我有一门课,里面是我的广播接收器。现在,我正在尝试将广播接收器与其分离,但我需要一种方法,以便我仍然可以与分离的广播接收器类中的类视图进行通信。

谢谢。

【问题讨论】:

    标签: android android-intent broadcastreceiver android-context


    【解决方案1】:

    例如你可以找到任何textView:

    TextView textView = (TextView) ((Activity) context).findViewById(R.id.textView1);
    

    【讨论】:

    • 好答案。这是2015年的做法,上面的做法似乎很多余。
    • 你不能总是指望 context 是 Activity 的一个实例,对吗?
    • 如果你有一个 Activity 就是这种情况,所以它可以被强制转换,而不是 Context。这不是回答问题。
    • 我的问题与我的情况有点不同,但这种方法可以满足我的要求。非常感谢朋友!
    【解决方案2】:

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

    View rootView = ((Activity)_context).Window.DecorView.FindViewById(Android.Resource.Id.Content);
    

    在 Raw Android 中,它看起来像:

    View rootView = ((Activity)mContext).getWindow().getDecorView().findViewById(android.R.id.content)
    

    然后简单地在这个上调用 findViewById

    View v = rootView.findViewById(R.id.your_view_id);
    

    【讨论】:

    • 请记住,您应该将View v = rootView.findViewById(R.id.your_view_id); 转换为View v = (View) rootView.findViewById(R.id.your_view_id);,并且View 类可以是View 的任何派生类。
    • 当我尝试这个时,我得到“Caused by: java.lang.ClassCastException: android.app.Application cannot be cast to android.app.Activity”。
    • @drynyn 这是因为此示例假设正在为上下文传递一个 Activity,这不是一个安全的假设。您可以使用 instanceof 关键字来检查强制转换是否可以安全执行。 (例如,谷歌“instanceof java”)。
    【解决方案3】:

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

    View view = View.inflate(context, R.layout.ROOT_LAYOUT, null);
    

    现在您可以通过“视图”访问您的视图并将它们转换为您的视图类型:

    myImage = (ImageView) view.findViewById(R.id.my_image);
    

    【讨论】:

    • 根参数应该放什么?
    • root 参数是膨胀层次结构的根视图。在上面的示例中,我展示了如何扩展已经是根的视图,因此您可以将此参数设置为 false。如果您的膨胀视图不是根视图,那么您将根视图作为第三个参数。
    • 不应该是null 而不是false
    • 我不认为(重新)膨胀整个视图是一种非常有效或可靠的方法,因为它已经通过调用setContentView() 膨胀了。但是,如果您省略了对“setContentView()”的调用并在手动充气后手动附加它,那么您可能没问题(我完全忘记了如何执行此操作,但是可以在任何 Activity 或 @987654327 中完成手动视图附件@)。
    【解决方案4】:

    首先使用这个:

    LayoutInflater inflater = (LayoutInflater) Read_file.this
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
    Read file is current activity in which you want your context.
    
    View layout = inflater.inflate(R.layout.your_layout_name,(ViewGroup)findViewById(R.id.layout_name_id));
    

    然后您可以使用它来查找布局中的任何元素。

    ImageView myImage = (ImageView) layout.findViewById(R.id.my_image);
    

    【讨论】:

      【解决方案5】:

      为什么不直接使用单例?

      import android.content.Context;
      
      
      public class ClassicSingleton {
          private Context c=null;
          private static ClassicSingleton instance = null;
          protected ClassicSingleton()
          {
             // Exists only to defeat instantiation.
          }
          public void setContext(Context ctx)
          {
          c=ctx;
          }
          public Context getContext()
          {
             return c;
          }
          public static ClassicSingleton getInstance()
          {
              if(instance == null) {
                  instance = new ClassicSingleton();
              }
              return instance;
          }
      }
      

      然后在activity类中:

       private ClassicSingleton cs = ClassicSingleton.getInstance();
      

      并且在非活动类中:

      ClassicSingleton cs= ClassicSingleton.getInstance();
              Context c=cs.getContext();
              ImageView imageView = (ImageView) ((Activity)c).findViewById(R.id.imageView1);
      

      【讨论】:

      • 不错的尝试,但不幸的是这会引入内存泄漏,因为ClassicSingleton 将持有对 Activity 的引用。
      猜你喜欢
      • 1970-01-01
      • 2015-11-29
      • 2014-05-16
      • 2014-06-30
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 2015-11-09
      相关资源
      最近更新 更多