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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

1435閲覧

Android アプリ開発 intentについて

Puhu

総合スコア31

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2015/08/22 00:55

編集2015/08/22 00:59

こちらで何度か質問させていただいて、自分なりに今コードを書いています。
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>

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

質問とは関係ないですが,気になった点をいくつか

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

投稿2015/08/22 02:02

編集2015/08/23 14:24
swordone

総合スコア20651

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

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

Puhu

2015/08/23 12:50

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

2015/08/23 13:11

onCreateで「startActivityForResult(intent,requestCode); 」としても サブアクティビティが呼び出されるのは、onCreateを抜けたあと。 サブアクティビティが呼び出し→終了した後、 システムからonActivityResultが呼び出され、結果が取得出来る。 なら、JetPlayerを呼び出すタイミングは、onCreateではないですよね?
tenroku

2015/08/23 14:35 編集

もしかして普通のクラスと勘違いしてる?… いったん処理を中継するならアクティビティにする必要はありますが、 処理を中継しないのであれば普通のクラスです。 そもそもファイルの作り方というか概念を勘違いしているのでは。 メインアクティビティ→サブアクティビティ→サブアクティビティの処理(ボタンなど)→メインアクティビティ こういう流れならアクティビティでインテントです。 メインアクティビティ→サブルーチンやモジュールなど→メインアクティビティのように ユーザの反応を待たない処理だけで終わる場合はクラスです。
Puhu

2015/08/24 23:40

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

0

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

投稿2015/08/22 01:24

yona

総合スコア18155

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

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

Puhu

2015/08/24 23:41

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問