2016-04-08 10 views
0

Çevrimdışı çevrimdışı gibi bir ağ durumu göstergesi olarak işlev gören bir düğme var. Sorum şu: broadcast receiver'un genişlediği WifiStatusReceiver sınıfına sahibim. WifiStatusReceiver sınıfından bir düğmeyi etkinleştirmek veya devre dışı bırakmak istiyorum. Bunu nasıl yapabilirim ?? i bir düğmeye arka plan ayarlamak çalışırsanızBroadCast onReceive() yönteminden bir düğmeyi nasıl etkinleştirir veya devre dışı bırakırım

public class Wifi extends BroadcastReceiver implements ActionBar.TabListener{ 
ActionBar actionBar; 
@Override 
public void onReceive(Context context, Intent intent) { 
    Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show(); 

    ConnectivityManager connectivityManager = 
      (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 

    if (activeNetInfo != null 
      && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) { 
     Toast.makeText(context, "Wifi Connected!", Toast.LENGTH_SHORT).show(); 
     actionBar.setCustomView(R.layout.header); 
     actionBar.getCustomView().findViewById(R.id.btn_onlinestatus).setBackground(context.getResources().getDrawable(R.drawable.onlinestaticon)); 
    } else { 
     Toast.makeText(context, "Wifi Not Connected!", Toast.LENGTH_SHORT).show(); 

     actionBar.setCustomView(R.layout.header); 
     actionBar.getCustomView().findViewById(R.id.btn_onlinestatus).setBackground(context.getResources().getDrawable(R.drawable.offlinestaticon)); 
    } 
} 

onun "java.lang.RuntimeException belirten bir boş gösterici durum atma: alıcı com.balaji.example.Operations.Wifi başlatılamıyor: java.lang Eğer registerReceiver OnCreate - - .NullPointerException"

cevap

0
Main Activity 

    package com.checkisonline; 

    import android.net.ConnectivityManager; 
    import android.net.NetworkInfo; 
    import android.os.Bundle; 
    import android.os.Handler; 
    import android.os.Message; 
    import android.app.Activity; 
    import android.content.BroadcastReceiver; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.content.IntentFilter; 
    import android.graphics.Color; 
    import android.view.Menu; 
    import android.widget.Button; 

    public class MainActivity extends Activity { 

     Button wifiState; 
     private IntentFilter intfilt; 
     private boolean enableOrDisable=false; 

     BroadcastReceiver enableDisableBrodcastRecr = new BroadcastReceiver() 
     { 

      @Override 
      public void onReceive(Context arg0, Intent arg1) { 


       enableOrDisable=arg1.getExtras().getBoolean("enableordisable");//enableordisable is Key which is passed inside onReceive method of Wifi 

       handler.sendEmptyMessage(0); 

      } 
     }; 

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

      intfilt = new IntentFilter(); 
      intfilt.addAction("EnableDisableAction"); 

      registerReceiver(enableDisableBrodcastRecr, intfilt); 

      wifiState=(Button)findViewById(R.id.state); 

     } 

     @Override 
     protected void onResume() { 
      // TODO Auto-generated method stub 
      super.onResume(); 


      if(checkWifiState()==true) 
       { 

       wifiState.setText("Wifi-ON"); 
       wifiState.setTextColor(Color.GREEN); 
       }else 
       { 

        wifiState.setText("Wifi-OFF"); 
        wifiState.setTextColor(Color.RED); 
       } 
     } 

     @Override 
     protected void onPause() { 
      // TODO Auto-generated method stub 
      super.onPause(); 

     } 

     @Override 
     protected void onDestroy() { 
      // TODO Auto-generated method stub 
      super.onDestroy(); 

      unregisterReceiver(enableDisableBrodcastRecr); 
     } 

     private Handler handler = new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 

       if(enableOrDisable==true) 
       { 

       wifiState.setText("Wifi-ON"); 
       wifiState.setTextColor(Color.GREEN); 
       }else 
       { 

        wifiState.setText("Wifi-OFF"); 
        wifiState.setTextColor(Color.RED); 
       } 

      } 
    }; 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      // Inflate the menu; this adds items to the action bar if it is present. 
      getMenuInflater().inflate(R.menu.activity_main, menu); 
      return true; 
     } 


     public boolean checkWifiState() 
     { 
      boolean wifistate; 
      ConnectivityManager connectivityManager = 
        (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 


      if (activeNetInfo != null 
        && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) {   
       wifistate=true; 

      } else { 
       wifistate=false; 
      } 

      return wifistate; 
     } 



    } 

    Wifi Receiver 

    package com.checkisonline; 

    import android.content.BroadcastReceiver; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.net.ConnectivityManager; 
    import android.net.NetworkInfo; 



     public class WifiReceiver extends BroadcastReceiver { 

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

        ConnectivityManager connectivityManager = 
          (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 
        NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 

        Intent broadcastIntent = new Intent(); 
        broadcastIntent.setAction("EnableDisableAction"); 
        if (activeNetInfo != null 
          && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) { 

         broadcastIntent.putExtra("enableordisable", true); 

        } else { 

         broadcastIntent.putExtra("enableordisable", false); 

        } 
        context.sendBroadcast(broadcastIntent); 
       } 
     } 

    activity_main.xml 

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" > 

      <Button 
       android:id="@+id/state" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentTop="true" 
       android:layout_centerHorizontal="true" 
       android:layout_marginTop="176dp" 
       android:textSize="20dp" 

       /> 

     </RelativeLayout> 

    Manifest.xml 

    <?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.checkisonline" 
     android:versionCode="1" 
     android:versionName="1.0" > 

     <uses-sdk 
      android:minSdkVersion="8" 
      android:targetSdkVersion="17" /> 

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

     <application 
      android:allowBackup="true" 
      android:icon="@drawable/ic_launcher" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme" > 
      <activity 
       android:name="com.checkisonline.MainActivity" 
       android:label="@string/app_name" > 
       <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 

        <category android:name="android.intent.category.LAUNCHER" /> 
       </intent-filter> 
      </activity> 

      <receiver android:name="com.checkisonline.WifiReceiver" android:enabled="true"> 
      <intent-filter> 
       <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> 
       <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
      </intent-filter> 
     </receiver> 


     </application> 

    </manifest> 

Now as you required use ActionBar object wherever I used Button. 
Enjoy.... 
+0

harika teşekkürler Raghavendra. –

+0

İhtiyaç kaydınıza bağlı olarak ve Dinamik Braoadcast Alıcısını unRegister. OnResume ve onPause içinde kullanmak daha iyidir. OnDestroy için beklemek alıcıyı dağıtmak için iyi bir alışkanlık değildir çünkü onDestroy her zaman denir. –

0

Ben bu duruma için LocalBroadCast kullanmak gerektiğini düşünüyorum bunun olmasına istemiyorsanız Düğme İşleyici size kaydını ve isterseniz tekrar sicil - OnPause veya OnStop (belki) kayıt olup olmadığını kontrol edin> unreg isterReceiver Kişisel Gereklilik/Tasarım sen unRegisterReceiver alışkanlık Niyet gönderilen Broadcast dinlemek mümkün çağrılıp çağrılmadığını

Bu yüzden dikkatli olmak da onCreate()-onDestroy() veya onStart()-onStop() içine kayıt ve kaydını silmek Alıcı olabilir dayanarak

+0

bana bir örnek gösterebilir miyim, ben butonu ile uğraşmıyorum Ben jus açık veya kapalı iken o zaman düğme arka planını değiştirmek istiyorum jus. –

+0

Hmm, ilk önce şunu okumanız gerektiğini düşünüyorum: http://stackoverflow.com/a/8875292/5722004 –

0
public class Wifi extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show(); 

     ConnectivityManager connectivityManager = 
       (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 

     Intent broadcastIntent = new Intent(); 
     broadcastIntent.setAction("EnableDisableAction"); 
     if (activeNetInfo != null 
       && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) {   

     Toast.makeText(context, "WifiConnected!",Toast.LENGTH_SHORT).show(); 
     broadcastIntent.putExtra("enableordisable", true); 


     } else { 
      Toast.makeText(context, "Wifi Not Connected!", Toast.LENGTH_SHORT).show(); 
      broadcastIntent.putExtra("enableordisable", false); 
     } 
     arg0.sendBroadcast(broadcastIntent); 
    } 

Now in your activity 

private IntentFilter intfilt; 
private boolean enableOrDisable=false; 
private ActionBar actionBar; 
BroadcastReceiver enableDisableBrodcastRecr = new BroadcastReceiver() 
    { 

     @Override 
     public void onReceive(Context arg0, Intent arg1) { 

      enableOrDisable=arg1.getExtras().getBoolean("enableordisable");//enableordisable is Key which is passed inside onReceive method of Wifi 

      // For Refreshing The message 

     } 
    }; 

onCreate() 
{ 
    intfilt = new IntentFilter(); 
    intfilt.addAction("EnableDisableAction"); 
} 

onResume() 
{ 
registerReceiver(enableDisableBrodcastRecr, intfilt); 

if(enableOrDisable==true) 

    { 
actionBar.setCustomView(R.layout.header); 
     actionBar.getCustomView().findViewById(R.id.btn_onlinestatus).setBackground(context.getResources().getDrawable(R.drawable.onlinestaticon)); 

    }else 
    { 
actionBar.setCustomView(R.layout.header); 
     actionBar.getCustomView().findViewById(R.id.btn_onlinestatus).setBackground(context.getResources().getDrawable(R.drawable.offlinestaticon)); 
    } 

} 

onPause() 
{ 
     unregisterReceiver(enableDisableBrodcastRecr); 
} 

Not: Her zaman UI iş parçacığı dışındaki kullanıcı arabirimini güncellememelisiniz

+0

bu broadcastIntent & arg0 nedir? –

+0

Sorunum düğmeyi güncelleyemiyor ancak uygulamayı başlattığımda yalnızca değişiklik algılandı. –

+0

arg0 Bağlam –

İlgili konular