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

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

ただいまの
回答率

87.49%

Android アプリ開発 intentについて

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,162

score 31

こちらで何度か質問させていただいて、自分なりに今コードを書いています。
MainActivityで用意したint型の配列codecide(初期値 {2,0,0,0,0,0,2}をintentでransuというサブアクティビティに送り、乱数を取得し、その乱数の値をcodicideに格納して、またMainActivityに送り返す、ということをしています。

実行はするのですが、値が初期値のまま変わりません。何度実行しても同じなので、乱数でそうなったとはとても考えられないのですが、intentの処理がおかしいのでしょうか。それとも、intentは正しくできているが、私の乱数生成の処理、その後の条件による前後入れ替えの処理がおかしいのでしょうか。

MainActivity

import android.app.Activity;
import android.media.JetPlayer;
import android.os.Bundle;
import android.content.Intent;

public class MainActivity extends Activity {

    static JetPlayer jetPlayer;
    static boolean aug;
    static int[] codicide = {2,0,0,0,0,0,2};
    //0 = Am 1 = B  2 =C  3 = Dm  4 = Em  5= F  6 = G

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        Intent intent = new Intent(this,com.example.sere.myapplication.ransu.class);
        intent.putExtra("codicide",codicide);
        int requestCode = 1000;
        startActivityForResult(intent,requestCode);

        this.jetPlayer = JetPlayer.getJetPlayer();
        this.jetPlayer.loadJetFile(getResources().openRawResourceFd(R.raw.pianist));
        jetPlayer.clearQueue();

            for(int i=0;i<7;i++) {
                aug = jetPlayer.queueJetSegment(codicide[i], -1, 0, 0, 0, (byte) 0);
                if (aug == false){
                    int trueCount=0;
                    while(trueCount !=2){
                         aug = jetPlayer.play();
                        if(aug == true) {
                            trueCount++;
                        }
                    }
                    jetPlayer.clearQueue();
                }
            }
        jetPlayer.play();
    }

    public void onActivityResult(int requestCode,int resultCode,Intent intent)
    {
        super.onActivityResult(requestCode,resultCode,intent);
        //startActivityForResult()の際に指定した識別コードとの比較
        if(requestCode == 1000){
            //返却結果ステータスとの比較
            if(resultCode == Activity.RESULT_OK){
                //返却されてきたintentから値を取り出す
                codicide = intent.getIntArrayExtra("RESULT");
            }
        }
    }
}

ransu(SubActivity)

import java.util.Random;
import android.app.Activity;
import android.widget.TextView;
import android.content.Intent;
import android.os.Bundle;

public class ransu extends Activity{

    @Override
    public void onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState);

        Intent intent = getIntent();
        int[] codicide = intent.getIntArrayExtra("codicide");

        codicide = SoundRandom(codicide);

        Intent intents = new Intent(/*this,MainActivity.class*/);
        intents.putExtra("RESULT",codicide);
        setResult(RESULT_OK,intents);
        //int requestCode = 1000;
       // startActivityForResult(intents,requestCode);
       finish();
    }

    public static int[] SoundRandom(int[] codicide){
        TextView textview = null;
        int count = 0;
        Random rnd = new Random();
        int ran = 0;
        int[] code ={0,0,0,0,0,0,0};
        int taihi = 0;
        boolean aug;
        //0 = Am 1 = B  2 =C  3 = Dm  4 = Em  5= F  6 = G

        for(int i = 0; i<6;i++){
            ran = rnd.nextInt(7);//0~6の乱数を発生させ、配列に格納。
            code[i] = ran;
        }

        taihi = 1;

        do {
            taihi = 0;
            for (int j = 0; j < 6; j++) {
                for (int i = 1; i < 6; i++) {
                    if (code[j] == 6) {
                        if (code[i] == 5) { //G→Fなら
                            taihi = code[j];
                            code[j] = code[i]; //前後入れ替え
                            code[i] = taihi;
                        } else if (code[i] == 3) {//G→Dmなら
                            taihi = code[j];
                            code[j] = code[i];
                            code[i] = taihi;
                        }
                    }else if (code[j] == 3) {
                        if (code[i] == 5) { //Dm→Fなら
                            taihi = code[j];
                            code[j] = code[i]; //前後入れ替え
                            code[i] = taihi;
                        }
                    } else if (code[j] == 4) {
                        if (code[i] == 6) { //Em→Gなら
                            taihi = code[j];
                            code[j] = code[i]; //前後入れ替え
                            code[i] = taihi;
                        }
                    } else if (code[j] == 0) {
                        if (code[i] == 2) { //Am→Cなら
                            taihi = code[j];
                            code[j] = code[i]; //前後入れ替え
                            code[i] = taihi;
                        }
                    }
                    String henkan = String.valueOf(code[i]);
                    CharSequence text = henkan;
                    textview.setText(text);
                }
            }

        }while(taihi != 0);//入れ替えが発生しなくなるまでやる。
        for(int i=1;i<6;i++){
            codicide[i] = code[i-1]; //最初と最後はC。
        }
        return (codicide);
    }

}


AndroidManifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.sere.myapplication" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
     <activity
            android:name=".ransu"
            android:label="@string/app_name" >
        </activity>
    </application>

</manifest>

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

MainActivityのonCreateの途中でstartActivityForResultを起動してSubActivityを起動しているわけですが,
この時点で処理が中断するわけではなく,後に続く処理は普通に続行します.
すなわち,「値が変わらない」のではなく,「値が変わる前に処理を行っている」というのが現在の状態となります.

質問とは関係ないですが,気になった点をいくつか
  • わざわざこの乱数生成を別Activityに起こす必要はないのでは?同じActivity内で別メソッドとして入れれば十分
  • SubActivityにおいて,TextViewがnullのままになっているように見える.そのままsetTextしたら例外が発生するはずでは?
  • StringはCharSequenseインタフェースを実装しているので,わざわざ変換しなくともそのままsetTextの引数として渡せる
  • 入れ替え作業の際,入れ替え対象に0が選ばれるとtaihiに0が入るため,「入れ替えが起きたのにループを抜ける」という事態になる
  • 配列0番目以外はfor(i = 1)により再度入れ替えの対象となり,望む順番にならない.

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/08/23 21:50

    追記ありがとうございます!
    今回はintentじゃなくすれば解決しそうですが、どうしても送った値をサブアクティビティで処理してから次の処理をしたい場合は、どのように実装したらよいのでしょうか...

    キャンセル

  • 2015/08/23 22:11

    onCreateで「startActivityForResult(intent,requestCode); 」としても
    サブアクティビティが呼び出されるのは、onCreateを抜けたあと。

    サブアクティビティが呼び出し→終了した後、
    システムからonActivityResultが呼び出され、結果が取得出来る。

    なら、JetPlayerを呼び出すタイミングは、onCreateではないですよね?

    キャンセル

  • 2015/08/23 23:33 編集

    もしかして普通のクラスと勘違いしてる?…
    いったん処理を中継するならアクティビティにする必要はありますが、
    処理を中継しないのであれば普通のクラスです。
    そもそもファイルの作り方というか概念を勘違いしているのでは。

    メインアクティビティ→サブアクティビティ→サブアクティビティの処理(ボタンなど)→メインアクティビティ
    こういう流れならアクティビティでインテントです。
    メインアクティビティ→サブルーチンやモジュールなど→メインアクティビティのように
    ユーザの反応を待たない処理だけで終わる場合はクラスです。

    キャンセル

  • 2015/08/25 08:40

    プログラムの不十分なアルゴリズムについてや、現在の状況など詳しく教えて頂き、ありがとうございました。大変助かりました!

    キャンセル

0

codicide = SoundRandom(codicide);
の前後でLog.dを使って配列内の値を全部コンソールに出力してみてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/08/25 08:41

    logを出力することで、プログラム作業が大変楽になりました。今後も使わせていただきます、ありがとうございました!

    キャンセル

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

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

関連した質問

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