【问题标题】:Calling SetContentView() from broadcast receiver从广播接收器调用 SetContentView()
【发布时间】:2011-03-21 09:40:14
【问题描述】:

在我的应用程序中有两个类,一个是 InternetActivity,它只扩展 Activity 并将 contentview 设置为 main。和扩展广播接收器的 MyClass。

我在 main.xml 文件中有 2 个 TextView 和 2 个 WIFI 和 GPRS 的 ImageView。 当连接发生变化时,会调用广播接收器,并根据启用的内容和不启用的内容来设置 TextView 和 ImageView 的可见性。但它只显示图像而不是变化。 这是 MyClass.java 文件。我该怎么做??

public class MyClass extends BroadcastReceiver {

private static ImageView wifi_image, gprs_image;
private static TextView wifi_text, gprs_text;

@Override
public void onReceive(Context context, Intent intent) {

    Log.i("IntrntActivity", "Broadcast message receivved");

    LinearLayout layout = new LinearLayout(context);
    LinearLayout.LayoutParams params = new LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

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

    wifi_image = (ImageView) view.findViewById(R.id.wifi_image);
    gprs_image = (ImageView) view.findViewById(R.id.gprs_image);

    wifi_text = (TextView) view.findViewById(R.id.wifi_text);
    gprs_text = (TextView) view.findViewById(R.id.gprs_text);

    wifi_image.setVisibility(View.GONE);
    wifi_text.setVisibility(View.GONE);
    gprs_image.setVisibility(View.GONE);
    gprs_text.setVisibility(View.GONE);

    ConnectivityManager cm = (ConnectivityManager) context
            .getSystemService(context.CONNECTIVITY_SERVICE);
    NetworkInfo WIFI = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    NetworkInfo Mobile = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

    if (!WIFI.isConnected() && WIFI.isAvailable()) {
        Toast.makeText(context, "WIFI is available but not connected",
                Toast.LENGTH_LONG).show();
    }

    if (cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isAvailable()) {
        wifi_image.setVisibility(View.VISIBLE);
        wifi_text.setVisibility(View.VISIBLE);

    }

    if (Mobile.isConnected()) {
        gprs_image.setVisibility(View.VISIBLE);
        gprs_text.setVisibility(View.VISIBLE);
        Log.i("IntrntActivity", "Mobile isConnected");

        // Toast.makeText(context,"GPRS is available",
        // Toast.LENGTH_LONG).show();
    }

    if (!Mobile.isConnected()) {
        gprs_image.setVisibility(View.GONE);
        gprs_text.setVisibility(View.GONE);
        Log.i("IntrntActivity", "Mobile is Not Connected");
        // Toast.makeText(context,"GPRS is available",
        // Toast.LENGTH_LONG).show();
    }


}

}

P.S:它正确地进入Mobile.isConnected()!Mobile.isConnected() 并在日志文件中显示,但它的可见性没有改变。我没有正确设置视图吗?是否可以从此广播接收器调用 setContentView(view)?

【问题讨论】:

    标签: android broadcastreceiver


    【解决方案1】:

    您需要将您的接收者放入 InternetActivity 类,在那里注册并使用已经定义的局部变量。您无需创建单独的公共 BroadcastReceiver 实现,只需执行本地实现即可。

    像这样:

    import android.content.BroadcastReceiver;
    import android.content.Context;
    
    public class InternetActivity extends Activity {
    
        private ImageView image;
        private TextView text;
    
        private BroadcastReceiver reciever = new BroadcastReceiver(){
            @Override
            public void onReceive(Context context, Intent intent) {
               // do all the checking
               // interact with image and text
            }    
        };
        @Override
        public void onCreate(Bundle state) {
            setContentView(R.layout.....);
            // fill in image and text variables
        }
        @Override
        public void onStart() {
            registerReceiver(receiver, /* your intent filter here */);
        }
        @Override
        public void onStop() {
            unregisterReceiver(receiver);
        }
    }
    

    【讨论】:

    • 苦苦挣扎了一下,但最终还是完成了。
    • 还有其他方法吗.. 这样就不需要在activity中定义Broadcast Receiver on Receive///意味着如何让整个app的顶栏图像发生变化
    【解决方案2】:

    您无法将膨胀视图添加到您的活动内容视图中?!

    您应该将所有内容都膨胀并设置为 onCreate 方法中的内容视图。那么您的广播接收器应该只设置所选视图的可见性。

    class MyActivity extends Activity {
    
      private ImageView wifiIcon;
    
      public void onCreate() {
        setContentView(...);
        wifiIcon = (ImageView) findViewById(...);
      }
    
      private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
          // ...
          wifiIcon.setVisibility( isWifiEnabled ? View.VISIBLE : View.GONE);
        }
      };
    }
    

    【讨论】:

    • 我该如何实现?我如何从扩展 BroadcastReceiver()MyClass 调用 setContentView?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多