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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

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

Android Studio

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

Q&A

解決済

3回答

507閲覧

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

itoaitoai

総合スコア13

Java

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

Android Studio

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

0グッド

1クリップ

投稿2017/11/13 03:06

編集2017/11/13 03:36

お世話になります。
入力項目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/ツール等のバージョンなど)
より詳細な情報

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2017/11/13 03:28

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

2017/11/13 03:41

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

2017/11/13 04:22

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

2017/11/13 05:37

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

回答3

0

ベストアンサー

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

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

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

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

java

1... 2for (int ij = 0; ij < 4; ij++) { 3 rG[0].addView(rB[ij], new LinearLayout.LayoutParams(wc, wc)); 4 inLinearLayout[0].addView(rG[0], new LinearLayout.LayoutParams(wc, wc)); 5 6 rB[ij].setOnClickListener(new View.OnClickListener() { 7 @Override 8 public void onClick(View view) { 9 for (int ik = 0; ik < maxCkRow; ik++) { 10 for (int ikk = 4; ikk < maxCkRow; ikk++) { 11 String st = view.getTag().toString(); 12 int ii = parseInt(st.substring(0, 1)); 13 ik = parseInt(st.substring(1, 2)); 14 //----- CheckBoxのON/OFFを数値化 15 if (rB[ij].isChecked() == true || cB[ii][ikk].isChecked() == true) { 16 ^ 17 ...

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

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

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

java

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

面と向かって相談する際には相談を受ける方が問題解決に必要な事実で「質問者が明示していないこと」を逆に質問して引き出してくれますが、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 00:04

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itoaitoai

2017/11/14 02:52

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

2017/11/14 02:55

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

0

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

java

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

投稿2017/11/13 13:06

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itoaitoai

2017/11/14 02:43

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

0

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

java

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

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

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

投稿2017/11/13 04:58

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itoaitoai

2017/11/13 06:01

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問