通知が表示されない とかどうせブロックの設定だろ! → 原因「フィルター」

「通知をONにしているのに表示されないんだけど...」

ありますよね!

実際, 設定が多すぎて分かりづらいです.

ネット上の情報も, OSバージョンや機種の違いなどでさらに混乱します.

とりあえず, すべての設定項目を列挙してみます.

そのアプリ内での「設定」

そのアプリの中の「設定」をONにします.

LINEの場合は以下のような画面ですね.

20161125-152024

OSの設定「アプリ」から

OSの「設定」アイコンから「アプリ」を選択.

そして対象アプリを選択後,「通知を表示」のチェックボックスをONにします.

20161125-153800

ネット上にこの設定の話がたくさんありますが, Android 6.x (Marshmallow) では, このチェックボックはなかったりします.

OSの設定「通知」から

OSの「設定」アイコンから「通知」を選択.

「ヘッドアップ」「端末がロック」とよくわからない言葉が表示されていますが, とりあえず上から2つをONにしていきます.

20161125-154834

続いてその下の「アプリの通知」をタップして対象のアプリを選択して

「ブロック」はOFFに, ロック画面に表示」をONにします.

20161125-155321

この画面は, Android 6.0 では, こんな画面なので, 1つOFF, 2つONにします.

20161125-160017

続いて, 私がはまっていた「フィルタリング」の設定です.

通知バーが表示されたときに, 長押しからなんとなくこの「フィルタリング」を押してしまっている人が多いのではないかと思います.

20161125-161030

簡単に非表示にできるわりには, 再度表示させるときの設定がわかりずらいです.

先ほどの「通知」の画面で「通知のフィルタリング」をタップします.

20161125-161447

「フィルタリング(無視して表示しない)」している通知が一覧で表示されます.

20161125-161727

この中から復活表示したい通知をタップすると, 無視された回数などが表示されますので, ここで「削除」を押すとフィルターから除外されて表示されるようになります!

20161125-162824

まとめ

「通知する」をONにしたあと, 「ブロック」と「フィルター」をOFFにする.

OS設定は「設定-通知」と「設定-アプリ」の2つの中のどこかにある.

設定多すぎ.

👉 【Android10/11】通知が来ない、遅れるときに見直すべき「電池(バッテリー)の最適化」 

👉【Android Pie】「通知」設定のシンプルな考え方


RecyclerView のアイテムの中のある部分のクリック

list_mail

まずは, 入れ子なしでばらして書かせたほうがいいような気がするのです.

java - Why doesn't RecyclerView have onItemClickListener()? And how RecyclerView is different from Listview? - Stack Overflow


public static class MyViewHolder extends RecyclerView.ViewHolder {

  public TextView text;
  public ImageView image;
  public OnClickPartsListener listener;

  public MyViewHolder(View itemView, OnClickPartsListener listener) {
    super(itemView);

    this.listener = listener;
    text = (TextView) itemView.findViewById(R.id.text);
    image = (ImageView) itemView.findViewById(R.id.image);

    text.setOnClickListener(new View.OnClickListener {
      listener.onClickText("Text Clicked!!");
    });

    image.setOnClickListener(new View.OnClickListener {
      listener.onClickImage("Image Clicked!!");
    });

  }

  public interface OnClickPartsListener {
    void onClickText(String message);
    void onClickImage(String message);
  }

}


public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {

  private MyViewHolder.OnClickPartsListener listener;

  public MyAdapter(MyViewHolder.OnClickPartsListener listener) {
    this.listener = listener;
  }

  @Override
  public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    //..	 
    return new MyViewHolder(view, listener);
  }

}


public class MyActivity extends AppCompatActivity {  
  
  @Override  
  protected void onCreate(Bundle savedInstanceState) {  

    MyViewHolder.OnClickPartsListener listener =
      new MyViewHolder.OnClickPartsListener() {
  
        public void onClickText(String message) {
          Toast.makeText(this, message, LENGTH_SHORT).show();  
        }

        public void onClickImage(String message) {
          Toast.makeText(this, message, LENGTH_SHORT).show();  
        }

      };

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);  
    adapter = new MyAdapter(listener) {  
    recyclerView.setAdapter(adapter);  

  }

}

めんどくさいので,


public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {

  private final PublishSubject<String> onClickSubject = PublishSubject.create();

  @Override 
  public void onBindViewHolder(final ViewHolder holder, int position) {

    final Item item = items.get(position);

    holder.itemView.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        onClickSubject.onNext(item);
      }
    });
  }

  public Observable<String> getPositionClicks(){
    return onClickSubject.asObservable();
  }

}

または, イベントバス..

まとめ

親や祖父母側で実装した子や孫のインターフェースをコンストラクタ経由で渡し返す.

tag を上手に使うとよい.


よくある Observable の入れ子ができない頭の硬さ乙

99

なぜか長ったらしくなる Observable のネスト.


Observable.just("yo")
    .flatMap(s -> Observable.range(0, 100))
    .subscribe(integer -> Ln.d("Here's an Integer(%s), but how do I access that juicy String?", integer));

Passing composite data through flatMap and similar operators without creating container objects · Issue #2931 · ReactiveX/RxJava

よくあるくせに綺麗に書けない.

そんなわたし乙.

lambda も絡めてゆっくりと眺める.

元.


Observable.just("yo")
    .flatMap(new Func1<String, Observable<? extends Integer>>() {
      @Override public Observable<? extends Integer> call(String s) {
        return Observable.range(0, 100);
      }
    })
    .map(new Func1<Integer, String>() {
      @Override public String call(Integer integer) {
        return String.format("Here's an Integer(%s), but how do I access that juicy String?", integer);
      }
    })
    .subscribe(new Action1<String>() {
      @Override public void call(String x) {
        System.out.println(x);
      }
    });

flatMap(Func1, Func2) でやる場合.


Observable.just("yo")
    .flatMap(new Func1<String, Observable<? extends Integer>>() {
      @Override public Observable<? extends Integer> call(String s) {
        return Observable.range(0, 100);
      }
    }, new Func2<String, Integer, String>() {
      @Override public String call(String s, Integer integer) {
        return String.format("Here's an Integer(%s), with String(%s)", integer, s);
      }
    })
    .subscribe(new Action1<String>() {
      @Override public void call(String x) {
        System.out.println(x);
      }
    });

flatmap に map を入れ子でやる場合.


Observable.just("yo")
    .flatMap(new Func1<String, Observable<? extends String>>() {
      @Override public Observable<? extends String> call(String s) {
        return Observable.range(0, 100)
            .map(new Func1<Integer, String>() {
              @Override public String call(Integer integer) {
                return String.format("Here's an Integer(%s), with String(%s)", integer, s);
              }
            });
      }
    })
    .subscribe(new Action1<String>() {
      @Override public void call(String x) {
        System.out.println(x);
      }
    });
  }

lambda へ

元.


Observable.just("yo")
    .flatMap(s -> Observable.range(0, 100))
    .map(integer -> String.format("Here's an Integer(%s), but how do I access that juicy String?", integer))
    .subscribe(System.out::println);

flatMap(Func1, Func2) でやる場合.


Observable.just("yo")
    .flatMap(s -> Observable.range(0, 100),
        (s, integer) -> String.format("Here's an Integer(%s), with String(%s)", integer, s))
    .subscribe(System.out::println);

flatmap に map を入れ子でやる場合.


Observable.just("yo")
    .flatMap(s -> Observable.range(0, 100)
        .map(integer -> String.format("Here's an Integer(%s), with String(%s)", integer, s)))
    .subscribe(System.out::println);

まとめ

flatmap に map を入れるのがわかりやすいように思います.

慣れたらラムダも直感的です.

Feature request: @Passthru variable for Rx chains · Issue #855 · square/retrofit