2014/09/08

[android]基底クラスで今のActivity名を知りたい

NFC関係の画面を作っているのだが、いくつか作っていると、だいたいどの画面でも同じようなことを書いていることに気付いた。
onResume()でenableForegroundDispatch()して、onPause()でdisableForegroundDispatch()して、あとはインテントが飛んできたときに処理する・しないを書いて・・・。

えーい、こういうときはActivityの派生クラスを作って、そこにまとめてしまおう。
abstractでextends Activityなクラスを作って処理をまとめた。

それはよかったのだが、「このActivityのときはやらないけど、それ以外ではやる」というのがあった。
タイトルバーをタップしたときに、一番上のActivityに戻る処理だ。

if (!getLocalClassName().equals(MainActivity.class.getSimpleName())) {
    getActionBar().setHomeButtonEnabled(true);
    getActionBar().setDisplayHomeAsUpEnabled(true);
}
Activityが提供しているのが、一番下のクラス名を返すAPIだったので、それにあわせている。
同じActivity名で別パッケージが存在すると区別はつかないのだが、まあこれでいいや。

8 件のコメント:

  1. クラス判定の時は以下の処理が素敵です。
    if( this instanceof MainActivity){ ... }

    これだと"同じActivity名で別パッケージが存在すると区別はつかない"問題は解消されるっす。

    返信削除
    返信
    1. いつもありがとうございます。

      この1行で!というよりも、Javaってそういうことができる言語なんですね・・・。

      置き換えようかと思ったけど、そもそも基底クラスが派生クラスのことを考えるというのも変なので、タイトルバーをタップしても何もしないActivityと、それを派生させてタイトルバーをタップできるActivityを作った方がよいように思えてきました。。。

      削除
  2. そうっすね!そもそも基底クラスが派生クラスを知ってる状態に問題がありますね。
    基底クラスに処理可否のフラグを持たせて、派生クラスのコンストラクタかどこかでtrue or falseを設定させるとかいいかもしれませんね。

    返信削除
    返信
    1. 1つ、嫌なのが残りました。
      このMainActivity以外は、タップするとMainActivityに戻りたい、という動作です。
      ここまで来ると、もういいかな、と私は諦めて直打ちするんですが、まだ甘いですかね。。

      削除
  3. Activityのライフサイクルに依存する処理は画面なしのFragmentにまとめると収まりがいいので、NFC関連の処理はFragmentに書いてますねー

    返信削除
    返信
    1. Fragment・・・。
      一時期から急に、フラグメントという文字をよく見るようになり、設定画面もPreferenceActivityからPreferenceFragmentになりつつあるようだったので、気にはしていたのですがノータッチでした。
      よし、勉強って事で眺めてみますー

      削除
    2. 画面の有るFragmentはなれるまで使いところが難しいかもです。。縦で1画面、横にした時に2画面とかやらないのであればとりあえず放置でも。。
      画面なしFragmentはお世話になったNFC HacksのHACK#37で使ったので、もしかすると参考になるかもしれません(宣伝

      削除
    3. なぬっ、あのNFCのことならまずこの本を読めといわれているNFC Hacksに載っているんですね(くどい)!

      読んでいったんですが、まだJavaの言語仕様とAndroidのライフサイクルが身についてないので、頭の中で絵ができあがりませんでした・・・。
      まずは画面無しからはじめてみますー

      削除

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。