質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.02%

  • Java

    12148questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android Studio

    3173questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

(java)入力項目8→、表示項目表示(16進数への変換)

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 204

itoaitoai

score 5

お世話になります。
入力項目8つから、16進数への変換して、表示することで困っております。

前提・実現したいこと

AndroidStudioで、設定アプリを作っています。

実装1
---------
入力項目8(チェックボックス8)の設定から、
表示項目へ「16進数の表示」を行う処理を実装しております。
 →こちらは、できました。

実装2
---------
実装1を元に、
入力項目8(ラジオ4+チェックボックス4)の設定から、
表示項目へ「16進数の表示」を行う処理を実装しております。

該当のソースコード

実装1
                for (int ij = 0; ij < maxCkRow; ij++) {
                    cB[ii][ij].setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            String st = view.getTag().toString();
                            int ii = parseInt(st.substring(0, 1));
                            int ij = parseInt(st.substring(1, 2));
                            //----- CheckBoxのON/OFFを数値化
                            if (cB[ii][ij].isChecked() == true) {
                                SetData[ii + 5] |= (int) Math.pow(2, ij);           // BitSet
                                System.out.println("ii:"+ ii +"ij:"+ ij + "SetData:"+SetData[5+ii]);
                            } else {
                                SetData[ii + 5] &= (byte) ~(byte) Math.pow(2, ij);  // BitReset
                                System.out.println("ii:"+ ii +"ij:"+ ij + "SetData:"+SetData[5+ii]);
                            }
                            et[ii].setText(String.format("  %02X  ", Integer.valueOf(SetData[ii + 5])));  // 16進表示
                        }
                    });
                    inLinearLayout[ii].addView(cB[ii][ij], new LinearLayout.LayoutParams(wc, wc));  // チェックボックス
                }

試したこと

0~3は、ラジオの値
・4~7は、チェックボックスの値
 から、16進数を表示するように変更。

・教授お願いできないでしょうか。


                for (int ij = 0; ij < 4; ij++) {
                    rG[0].addView(rB[ij], new LinearLayout.LayoutParams(wc, wc));
                    inLinearLayout[0].addView(rG[0], new LinearLayout.LayoutParams(wc, wc));

                    //---- ラジオ ボタン クリック
                    rB[ij].setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {

                            for (int ik = 0; ik < maxCkRow; ik++) {      // 入力項目は、0~8まで
                                for (int ikk = 4; ikk < maxCkRow; ikk++) {   // チェックボックスは、4~8まで
                                    String st = view.getTag().toString();
                                    int ii = parseInt(st.substring(0, 1));
                                    ik = parseInt(st.substring(1, 2));
                                    //----- CheckBoxのON/OFFを数値化
                                    if (rB[ij].isChecked() == true || cB[ii][ikk].isChecked() == true) {
                                        SetData[ii + 5] |= (int) Math.pow(2, ik);           // BitSet
                                        System.out.println("ii:" + ii + "ij:" + ik + "SetData:" + SetData[5 + ii]);
                                    } else {
                                        SetData[ii + 5] &= (byte) ~(byte) Math.pow(2, ik);  // BitReset
                                        System.out.println("ii:" + ii + "ij:" + ik + "SetData:" + SetData[5 + ii]);
                                    }
                                }
                            }
                            et[0].setText(String.format("  %02X  ", Integer.valueOf(SetData[ii + 5])));  // 16進表示
                        }
                    });
                }

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • KSwordOfHaste

    2017/11/13 12:28

    「コードタグ」はなるべくつけるではなく「必ずつける」ようにしましょう。以前の質問にはついてますのでやり方はご存知のはずです。

    キャンセル

  • itoaitoai

    2017/11/13 12:41

    ```ここに言語を入力 コード ```を追加しました。以前の質問もご確認いただき、ご教授ありがとうございます。

    キャンセル

  • KSwordOfHaste

    2017/11/13 13:22

    「困っている点」は想像つきますが「どういう状態のとき」「どういう結果が期待」でそれに対して「実際の動作がどうなるか」「原因をどう推測してなぜ解決できないのか」など「状況と困っている点を明記」してください。ただ「困っている」としか書かれていない質問はよくありません。「https://teratail.com/help/question-tips」を参照ください。

    キャンセル

  • itoaitoai

    2017/11/13 14:37

    ご教授ありがとうございます。具体的に要点を記述するヒントがわかりました。参照を勉強して、回答がいただける質問をする力を身に着けていきます。要点ができましたら、編集しなおします。

    キャンセル

回答 3

checkベストアンサー

+2

質問のしかた(およびコード内容)についての指摘をいくつか申し上げます。

(1)質問の仕方への指摘

自分の想像ですが、本件をQ&Aに出すのではなく同僚か先輩に相談する際の会話の流れは次のようになると思います。

Q1: 困ってます。
A1: どうしたの?
Q2: CheckBoxとRadioButtonの状態を16進数にしたいのですが、困ってます。
A2: コードは?
Q3: これです
A3: で、何が困ってるの?
Q4: 次の箇所でエラーが出るんです。

...
for (int ij = 0; ij < 4; ij++) {
  rG[0].addView(rB[ij], new LinearLayout.LayoutParams(wc, wc));
  inLinearLayout[0].addView(rG[0], new LinearLayout.LayoutParams(wc, wc));

  rB[ij].setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      for (int ik = 0; ik < maxCkRow; ik++) {
        for (int ikk = 4; ikk < maxCkRow; ikk++) {
          String st = view.getTag().toString();
          int ii = parseInt(st.substring(0, 1));
          ik = parseInt(st.substring(1, 2));
          //----- CheckBoxのON/OFFを数値化
          if (rB[ij].isChecked() == true || cB[ii][ikk].isChecked() == true) {
                 ^
            ...


A4: どんなエラー?
Q5: こういうエラーです

内部クラスから参照されるローカル変数は、finalまたは事実上のfinalである必要があります

A5: なるほど、ijはforループの制御変数だけど値が変化する変数だからfinalとはならないんだよ
Q6: どうすればいいですか?
A6: 参照したいijの値を持つようなfinalな変数を宣言し、その変数を使うといいよ

...
for (int ij = 0; ij < 4; ij++) {
  int finalIj = ij;  // 一旦別の変数へ代入
  ...
  rB[ij].setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      for (int ik = 0; ik < maxCkRow; ik++) {
        for (int ikk = 4; ikk < maxCkRow; ikk++) {
          ...
          if (rB[finalIj].isChecked() == true || cB[ii][ikk].isChecked() == true) {
                 ^finalな変数を使うようにする
            ...

面と向かって相談する際には相談を受ける方が問題解決に必要な事実で「質問者が明示していないこと」を逆に質問して引き出してくれますが、Q&Aサイトではこういうような会話は普通想定しません。解決に必要な情報は質問者側がよく状況を整理した上で最初から質問文に残らず明記しておくことが何より重要です。あなたはA1~A2までは想定してコードを明示するところまではやっておられますが、それでは不足だったと言わざるを得ません。A3以降についても当然想定しておくべきです。質問コメントに書きましたが、あなたにこの点が把握できていないことが問題と感じました。

(2)その他コードで気になった点

(2-1) getTag()は(本件の部分以外に使ってないなら)それを使わなくても実装ができる
ここは質問者さんが困っている点かどうかはっきりしませんし前提が不明なのでなんとも言えませんが・・・getTagを用いる典型的なケースとは「同一のイベントハンドラーインスタンスを複数のViewへ設定する場合」ではないでしょうか?本件のコードでは「Viewごとにそれぞれ別のイベントハンドラーインスタンスを設定している」ためgetTagを介する制御は冗長に見えました。使う必要がなさそうなgetTagを用いておられる理由は(1)が遠因になっているようにも感じました)

(2-2) Math.pow
swordoneさんが指摘しておられる通りですが、Math.powを用いた実装はworseというよりはむしろworstに近いと思います。本件は入力も出力も2進数で誤差が生じない値のみを扱っているためたまたま期待どおりの結果が得られるかも知れませんが、「誤差の問題がないことを保証する」ためにはdoubleの誤差・Math.powの特性についてのかなりの知識が必要です。そのような難しい解法を選ぶよりは「誰でも正しいことが一目でわかる」整数演算(シフト演算)を用いるべきです。Math.powによる実装は例えば川を渡るのに橋の欄干を目をつぶって渡るにも似た危なっかしさを感じます。どうかすると川に落っこちてしまいますよ?

(2-3) if (式 == true)は冗長
if (式)と書くのが普通と思います。

(2-4) String.formatの引数SetData[ii + 5]のboxingが冗長
つまりInteger.valueOf(SetData[ii + 5])は冗長で、直接SetData[ii + 5]と書くのが普通な気がします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/14 11:52

    具体的に、記述頂き、お時間いただき、誠にありがとうございます。
    Q&Aサイトの仕組み等々、ご教授頂く、機会を頂き、
    とても感謝しております。今回の質問に関して、復習を行い、
    今後も利用させて頂きたく、エンジニアとして成長したいと存じます。
    コードの困っていることに関して、回答を頂いたことを、もとに、
    今から、記述を進めていきたいと思います。

    キャンセル

  • 2017/11/14 11:55

    意外に多くの質問者が(1)をわかってないため、大抵の場合そうした質問はスルーされてしまいます。Q&Aだけでなく普段他者とコミュニケーションを取る際にも大事なことだと思うのでよく考えてみてほしいなと思います。だれもが最初からできるわけではなく、訓練しないとなかなかうまくできないと思います。

    キャンセル

+2

質問とは直接関係ないですが、ビット演算したいなら、powよりもビットシフトのほうがいいです。
また、共通の処理はまとめるべきかと。

if (cB[ii][ij].isChecked() == true) {
    SetData[ii + 5] |= 1 << ij;           // BitSet
} else {
    SetData[ii + 5] &= ~(1 << ij);  // BitReset
}
System.out.println("ii:"+ ii +"ij:"+ ij + "SetData:"+SetData[5+ii]);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/14 11:43

    ビットシフトという方法を教えて頂き、非常に勉強になります。
    javaの経験が浅い為、ソースの読解力・理解が乏しのですが、わかりやすくなりました。
    ありがとうございます。

    キャンセル

+1

実装1を少し書き直すと下記となるでしょうか。

// 実装1
for (int ij = 0; ij < maxCkRow; ij++) {
   cB[ii][ij].setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View view) {
         String st = view.getTag().toString();
         int ii = parseInt(st.substring(0, 1));
         int ij = parseInt(st.substring(1, 2));

         //----- CheckBoxのON/OFFを数値化
         if (cB[ii][ij].isChecked()) {
            SetData[ii + 5] |= (int) Math.pow(2, ij); // BitSet
         } else {
            SetData[ii + 5] &= (byte) ~(byte) Math.pow(2, ij); // BitReset
         }

         System.out.println("ii:"+ ii +"ij:"+ ij + "SetData:" + SetData[5+ii]);

         et[ii].setText(String.format("  %02X  ", Integer.valueOf(SetData[ii + 5]))); // 16進表示
      }
   });

   inLinearLayout[ii].addView(cB[ii][ij], new LinearLayout.LayoutParams(wc, wc)); // チェックボックス
}

ここで、変数cBの型が未知ですが、おそらくandroid.widget.CheckBoxクラスの配列であるものと推測されます。
これを、android.widget.RadioButtonも扱えるように拡張する場合、配列の型としては、2つのクラスの親クラスであるandroid.widget.CompoundButtonとすれば一度に扱うことが可能です。

各オブジェクトがチェックボックスなのか、ラジオボタンなのかといった区別が必要な場合は、instanceof演算子を使用することで判別が可能です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/13 15:01

    ソースを改善頂き、ありがとうございます。
    ムダなコードがなくなり、非常に勉強になります。
    今年夏から携わりましたが、Androidクラスについて、無知であり、知ることができました。助かります。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    12148questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android Studio

    3173questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。