2014/09/08

[android]ProgressDialogのsetMessage()は、なんでresidがないんだろう?

純粋な疑問だ。

NFCのタグを待っている間、くるくるを出そうと思った。
サンプルを見ると、setTitle()やsetMessage()に文字列を設定している。
まあ、サンプルだからそういうもんだよな、とR.string.fooみたいなのを設定すると、setTitle()はいけるのに、setMessage()はエラーになった。

そういう実装なんだから、仕方ないと言えば仕方ないんだけど、なんでだろう?
show()なんかも、ことごとくCharSequenceを引数に取ってるし。
そういえば、AndroidはいつからかBuilderで作るようになってたな、と思い出した。

 

ProgressDialog.Builder builder = new ProgressDialog.Builder(this);

こんな感じでやっていくと、setMessage()もresidを受け付ける。
よしよし、と、最後にcreate()でProgressDialogにキャストし、SPINNERの設定をさせた。
さて、実行!

・・・キャストできません、と落ちた。
キャスト失敗って動的な例外なんだ、という感想はさておき、なんでだめなんだろう?
ProgressDialogはAlertDialogの派生だから、キャストしても悪くなさそうなのに。
(だから静的にはエラーが出てないんだろうけど。)

使いたければ使えばいいし、カスタマイズするなら自分でやればいいじゃないの、というスタンスなんだろうか・・・。

4 件のコメント:

  1. 確かにContextを保持しているはずなので勝手にリソースから引っ張ってきてくれても良さそうですが。。。なんでなんでしょうね。

    キャスト可能なのは親クラスへのキャストと、自分自身へのキャストのみです。
    親クラスから小クラスへのキャストが成立するのは、小クラスから親クラスにキャストしていたインスタンスを小クラスにキャストするとき(つまり小→親→子)のみで、単純な親→子ではClassCastExceptionになると思います。

    返信削除
    返信
    1. いつも、どうもです!

      Javaって、ダウンキャストできないんですね・・・。
      できないというか、限定的なんですね。
      どうしても、どうしてもですね、C++との比較になるんですよ。。

      Objectで返ってくるものをキャストできるのは、子→親→子、の関係だからなんですね。。
      ってことは、ProgressDialog.Builderクラスがないとどうしようもないのか。。

      削除
    2. まあでも、リソースから文字列を取ってくる事自体はActivityからならgetString(R.string.hoge)でいけるのであまり気にせずProgressDialog使ってますねー

      削除
    3. そんな感じなんですね。
      いや、仕事でやってる人なんかは「普通カスタマイズするから気にしたこともないですよ、はっはっは」などと想像してましたよ^^;

      削除

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