3

Закуски обеспечивают легкую обратную связь об операции, показывая краткое сообщение в нижней части экрана. Закуски могут содержать действие.Как добавить Snackbars в BroadcastReceiver?

Android также предлагает тост, в основном используемый для системных сообщений. Тосты похожи на закусочные, но не содержат действий и не могут быть вырезаны с экрана.

Мой вопрос

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.widget.Toast; 
public class TestReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(final Context context, final Intent intent) { 
     Toast.makeText(context, "status", Toast.LENGTH_LONG).show(); 
    } 
} 

ли Возможное, чтобы показать в BroadcastReceiver как Toast в Snackbar?

+0

BroadcastReceiver с обратной связью не вызывает никакого чувства ... ресивер должен заканчивать свою жалкую жизнь сразу после onRecive end ... onRecive вызывается в основном потоке ... это означает, что если вы не закончите, он не обновит UI ... сделайте это обычным способом ... в onRecive show notification (который будет действовать как ваша обратная связь) – Selvin

+0

можно разместить snakbar вместо тоста в моем коде. – praj

ответ

2

мой рабочий код ....

public abstract class TestReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(final Context context, final Intent intent) { 
     onNetworkChange(); 
    } 

    protected abstract void onNetworkChange(); 
} 

в mainactivity

public class MainActivity extends Activity { 

    public void onCreate() { 
     ... mReceiver = new TestReceiver() { 
      @Override 
      protected void onNetworkChange() { 
      snackbar = Snackbar.make(Clayout, "Please check your internet connection and try again", Snackbar.LENGTH_SHORT); 
      snackbar.setAction("X", snackbarClickListener);snackbar.setActionTextColor(Color.GREEN); 
      ColoredSnackbar coloredsnakbar=new ColoredSnackbar(); 
      coloredsnakbar.confirm(snackbar).show(); 
      } 
     };  
    } 
} 
5

Возможно ли показать snakbars в BroadcastReceiver как Toast?

A BroadcastReceiver зарегистрированной деятельности или фрагмента, через registerReceiver(), может спросить активность или фрагмент, чтобы показать закусочную.

Зарегистрированный зарегистрированный BroadcastReceiver не имеет пользовательского интерфейса, и, следовательно, ему негде показать закусочную. То, что он может сделать, - это сообщение о событии на входной шине события (например, LocalBroadcastManager, EventBus greenrobot, Square's Otto), чтобы любой пользовательский интерфейс, который находится на переднем плане, знал, что передача была получена. Если уровень пользовательского интерфейса получает сообщение, эта активность или фрагмент могут отображать закусочную. Если событие шины события не было выбрано, возможно, вы можете показать Notification в качестве резервной копии, если это необходимо.

3

Как сказал @CommonsWare сэр, должен быть некоторый проходной механизм между BroadcastReceiver и Activity/Fragment, где подключен пользовательский интерфейс.

Я попытался добавить interface, например, здесь:

public class TestReceiver extends BroadcastReceiver { 

    private DoSomethingInterface callback1; 

    public TestReceiver() { 
    } 

    @Override 
    public void onReceive(final Context context, final Intent intent) { 
     // pass content text to show in SnackBar 
     if(callback1 != null) { 
      callback1.passText("status"); 
     } else { 
      Log.e("log","callback from UI is not registered yet.."); 
     } 
    } 

    public void registerReceiver(DoSomethingInterface receiver) { 
     this.callback1 = receiver; 
    } 

    public interface DoSomethingInterface { 
     public void passText(String text); 
    } 
} 

DoSomethingInterface Реализовать в вашей деятельности или фрагмента, где вы показываете закусочной. Убедитесь, что вам нужно добавить CoordinatorLayout для отображения SnakeBar:

public class MainActivity extends Activity implements DoSomethingInterface { 

public void onCreate() { 
    ... 
    // pass reference to interface from onCreate() 
    BroadcastReceiver mReceiver = new TestReceiver(); 
    mReceiver.registerReceiver(this); 
    ... 
} 

    @Override 
    public void passText(String text) { 
     Snackbar.make(<reference to your coordinator layout>, "text", Snackbar.LENGTH_LONG) 
        .setAction("Ok", <listener>) 
        .setActionTextColor(Color.GREEN) 
        .show(); 
+0

public void registerReceiver (DoSomethingReceiver receiver) { это .callback1 = приемник; } ... это DoSomethingReceiver или DoSomethingInterface – praj

+0

Это 'DoSomethingInterface' – Kushal

+0

Попытка вызвать метод интерфейса 'void DoSomethingInterface.passText (java.lang.String)' на ссылке нулевого объекта – praj

1

У меня есть работа вокруг, без кодирования закусочная во всех видах деятельности onCreate() метод.

Мы можем использовать класс приложения для вызова BroadcastReciever. Как указано ниже.

public class MyApplication extends Application implements Application.ActivityLifecycleCallbacks { 
    public static Activity appactivity; 
@Override 
    public void onCreate() { 
     super.onCreate(); 
     registerActivityLifecycleCallbacks(this); 
} 
@Override 
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) { 
    } 

    @Override 
    public void onActivityStarted(Activity activity) { 

    } 

    @Override 
    public void onActivityResumed(Activity activity) { 
     appactivity = activity;//here we get the activity 
     Intent i = new Intent(this, InternetConnectionInformation.class); 
     sendBroadcast(i);//here we are calling the broadcastreceiver to check connection state. 
    } 
} 

Теперь мы можем использовать наш класс BroadcastReceiver показать закусочную, а

public class InternetConnectionInformation extends BroadcastReceiver{ 
    static Snackbar snackbar; //make it as global 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     ConnectivityManager connectivityManager 
       = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 

     if (activeNetworkInfo == null || !activeNetworkInfo.isConnected()) { 
       InternetConnectionInformation.snack(null, 0, "Network Connection failed.",context.getApplicationContext()); 
     }else{ 
      InternetConnectionInformation.hideSnackbar(); 
     } 
    } 




    public static void snack (HashMap<String,View.OnClickListener> actions,int priority,String message,Context context) { 
    if(MyApplication.appactivity != null){ 
      snackbar = Snackbar.make(MyApplication.appactivity.findViewById(android.R.id.content), message, Snackbar.LENGTH_INDEFINITE);//MyApplication.appactivity from Application class. 
      if (actions != null) { 
       Iterator iterator = actions.entrySet().iterator(); 
       snackbar.setDuration(Snackbar.LENGTH_INDEFINITE); 
       while (iterator.hasNext()) { 
        Map.Entry pair = (Map.Entry) iterator.next(); 
        snackbar.setAction((String) pair.getKey(), (View.OnClickListener) pair.getValue()); 
        iterator.remove(); // avoids a ConcurrentModificationException 
       } 
      } 
      switch (priority) { 
       case 0: 
        snackbar.getView().setBackgroundColor(context.getResources().getColor(R.color.accentPink)); 
        break; 
       case 1: 
        snackbar.getView().setBackgroundColor(Color.parseColor("#66ccff")); 
        break; 
       case 2: 
        snackbar.getView().setBackgroundColor(Color.parseColor("#66ff33")); 
        break; 
      } 
      snackbar.show(); 
      } 
     } 
     private static void hideSnackbar(){ 
      if(snackbar !=null && snackbar.isShown()){ 
       snackbar.dismiss(); 
      } 
     } 
    } 

Чтобы скрыть закусочные, нам нужно проверить состояние подключения.Так BroadcastReceiver зарегистрирован в Manifest

<receiver android:name="your.package.name.InternetConnectionInformation"> 
      <intent-filter> 
       <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
      </intent-filter> 
     </receiver> 

Это прекрасно работает и тестируется. Надеюсь, это поможет некоторым.

+1

элегантное решение, ему не хватает registerActivityLifecycleCallbacks (this); в onCreate – Cesar

Смежные вопросы