スクリーン間でデータを共有したい。

1,670 views
Skip to first unread message

なかむららうじー

unread,
May 11, 2012, 2:02:34 PM5/11/12
to app-inv...@googlegroups.com
どうも。初めまして。
App Inventorにてandroidアプリの開発をはじめたらうじぃと申します。  
早速ですが質問させていただきます。

現在AppInvantorでTwitter連携の可能なアプリを製作していまして、
各種設定や機能の切り替えのためにスクリーン上にかなりのボタンが羅列される事態となってしまい、見た目的によくない状況なってしまっています。

なのでその設定や機能の切り替えのボタン等を別スクリーンに移し、
タイムラインを表示するスクリーンを メインスクリーン
定型文やハッシュタグの設定ページを 設定用スクリーン という形で製作しました。
なんとか設定用スクリーンで入力した値をメインスクリーンで取り出したいのですが、どのような方法をとればよいのかわかりません。

スクリーン間における変数や、データベースの共有は可能なのでしょうか?


もしそれが不可能なのであれば、何かそれに代わる代替案などを教えていただけたら幸いです。
なお、一応TinyDBを用いて上記の用件を満たすプログラムを作成しましたが、うまくいきませんでした
(TinyDBなどもスクリーンごとに独立したものが生成されているのでしょうか?)

Takeaki Tada

unread,
May 12, 2012, 4:15:38 AM5/12/12
to app-inv...@googlegroups.com
らうじぃさん

こんにちは、多田です。

スクリーン間のデータの受け渡しは最近話題に上がりましたねー。

こちらをご覧ください。

スクリーン間のデータの受け渡しは可能です。
リンク先にその方法を文章で説明していますので、ご覧いただければと思います。

その上で、わからないことがありましたら、またお問い合わせください。

以上です。

2012年5月12日土曜日 3時02分34秒 UTC+9 なかむららうじー:

なかむららうじー

unread,
May 12, 2012, 11:54:22 AM5/12/12
to app-inv...@googlegroups.com
ご返事、ありがとうございます
おかげで目的の操作が可能になりました

質問既出でもうしわけありません・・・



2012年5月12日土曜日 17時15分38秒 UTC+9 Takeaki Tada:

Takeaki Tada

unread,
May 13, 2012, 10:34:19 AM5/13/12
to app-inv...@googlegroups.com
あ、うまくいきましたか。
良かったです。

既出の質問をしていただいても問題ないです。
ここは、それもOKっていうことになってますので。

2012年5月13日日曜日 0時54分22秒 UTC+9 なかむららうじー:

urushi

unread,
May 17, 2012, 4:00:38 PM5/17/12
to 日本App Inventorユーザー会
初めまして、urushiと申します。

いつも大変参考にさせてもらっております。

どうしても自己解決できない問題が出来てきたので、皆様にご教授をお願いできますでしょうか。

スクリーン間でのデータの引渡しで、新たにスクリーンをオープンさせた時のデータの受け渡しは理解できました。
しかし、その逆のクローズする場合の受け渡しは「close screen with result」を使うと
「アプリをクローズして、提示された値に APP_INVENTOR_RESULT 変数をセットします。」
とありますが、変数の参照の仕方がわからず、困っています。
nameブロックに「APP_INVENTOR_RESULT 」を指定してみたりしたのですが、参照できませんでした。

また、Screen1からScreen2オープンして処理した後、Screen2をクローズしたときはScreen1のどこに受け渡しの処理を書けばい
いのでしょうか?
なにかしらのイベントが発生するのでしょうか?
(Screen1.Initializeとか・・)

何卒よろしくお願いします。
> >>> *スクリーン間における変数や、データベースの共有は可能なのでしょうか?*

urushi

unread,
May 18, 2012, 10:29:31 AM5/18/12
to 日本App Inventorユーザー会
こんばんは、urushiです。

一日いろいろ試してみたところ、TinyDBでもスクリーン間でデータを参照しあえるんですね。
なので、closeするときにデータを渡すのではなく、終了時にTinyDBに書き込んでスクリーンをcloseするように変更しました。
(close.screen)
スクリーンはクローズされるので、戻るキーを押しても以前のスクリーンに移ることも無いので、アプリ的には問題無いと
考えてます。
まずは、この方法で作成します。

皆様お騒がせいたしました。
close.screen.with.valueについては追々調べてみます。

urushi

unread,
May 18, 2012, 9:20:16 PM5/18/12
to 日本App Inventorユーザー会
おはようございます。urushiです。

情報が間違えていたので、報告しておきます。
(十分な検証せず、投稿してしまいすいませんでした。)

今回は以下のようなテストアプリを作成しました。(実機はGALAXY NEXUS)
Screen1 TinyDB1にTag=test Value=textを保存
Button1.click->open anathor screen with value (screen=Screen2
Value=hoge この値は利用しないので何でもOK)

Screen2 TinyDB1よりTag=test をstoreするとtextを取得できます。
TinyDB1の内容をchangeに変更する
Button2.click->close screen with value (Value=hoge  この値も利用しないので何でもOK)

Screen1 TinyDB1よりTag=test をstoreするとchangeを取得できます。

このとき、Screen2でclose.screenを使うと、TinyDB1の内容はScreen1.TinyDB1では変更されません。

追加ですが、Screen1でScreen2を呼び出すときopen another screenを利用したら、Screen2はなかなか表示されま
せんでした。
表示される時間が遅すぎるのか?正常に動作しませんでした。

文章だけになってしまい、分かりにくかったかもしれませんがご容赦ください。

しゃみぃ

unread,
May 22, 2012, 3:29:03 AM5/22/12
to app-inv...@googlegroups.com
こんにちは。

何かと仕事が立て込んでおりまして(言い訳)

できなかったとの報告でしたがわたくしのアプリでは実現いたしておりますのでその手法を抜き出してまとめてみました。

よろしければご覧ください。

http://www.app.jp/~shyamys/AppI_sc_test001.html


・実機でなければスクリーンの変更ができません。
・私のはSharp SH12Cのみで確認しております。

しゃみぃ

--以下引用・・

urushi

unread,
May 22, 2012, 10:26:33 AM5/22/12
to 日本App Inventorユーザー会
こんばんは。

しゃみぃさん、返信ありがとうございます。
screenの中に受け取り用のパーツがあったんですね(^ ^;
探しきれていませんでした。。。。

早速、テストしてみました。
ちゃんとスクリーン間でデータの受け取りができますね (^ ^)/
ここでふと思い、3つのスクリーンを作ってテストしてみました。
残念ながら、スクリーンのnameの指定があるものの、スクリーン別にデータを受けることは出来ないですね。。。
データの中にスクリーン名を入れるなどして、区別する処理を入れる等工夫が必要です。

TinyDBが共通で使えるのは正式仕様なんでしょうか?
正式な仕様ではないのなら、今後のバージョンアップするタイミングで出来なくなると、アプリは正常に動かなくなります・・・。
困ったものです・・・。

open another screenは今回のテストでは、まったく問題なく動作しました。
動作環境かなにかがあったのか、単なる勘違いだったのか申し訳ありませんでした。

Takeaki Tada

unread,
May 22, 2012, 11:18:14 AM5/22/12
to app-inv...@googlegroups.com
しゃみぃさん

こんばんは、多田です。

お、実例があると助かりますね。
ありがとうございます。

2012年5月22日火曜日 16時29分03秒 UTC+9 しゃみぃ:

Takeaki Tada

unread,
May 22, 2012, 11:25:32 AM5/22/12
to app-inv...@googlegroups.com
urushiさん

こんばんは、多田です。

そうそう、スクリーン間の値の受け渡しは確か前々回のバージョン101に上がった時に
大きく変わって、開発をしている人が「変わりすぎてごめんなさい」って言っていました。

一応、その時に大きな変更をユーザーに強いてしまった事は
開発者の人達も認識しているので、今後は大きく変わる事はないと思います。

なので、スクリーン間の値の受け渡しにTinyDBを使っても大丈夫だと思います。

2012年5月22日火曜日 23時26分33秒 UTC+9 urushi:

しゃみぃ

unread,
May 22, 2012, 8:11:54 PM5/22/12
to app-inv...@googlegroups.com
お早うございます。

-\-引用ココから
> ここでふと思い、3つのスクリーンを作ってテストしてみました。
> 残念ながら、スクリーンのnameの指定があるものの、スクリーン別にデータを受けることは出来ないですね。。。
> データの中にスクリーン名を入れるなどして、区別する処理を入れる等工夫が必要です。
-\-ここまで
という事ですが、

基本的にデータ取得はサブスクリーンがCloseした時に起きるイベントとしてとらえているのだと思います。
結果としてResultには送り側のValueが
OtheScreenNameにはその閉じたスクリーン名が入ってきます。
Screen1のブロックエディタ中で
[Lavel1.text] ->[otherScreenName]
に変更してみてテストいたしますと
Lavel1.textに”Screen2”が入り表示されます。
もしも複数のScreenのどれかがCloseしたかどうかを検査したい場合にはこの変数の中身を確認するがよろしいかと思います。

たださんのおっしゃる様に開発進化の過程で起きるユーザーの一喜一憂もまたこれ楽しと思うが吉とぞんじます。

現実的にTinyDBを使いと言うのもよいでしょう、色々な方法が有ると思います。答えがいくつも有るのもまた楽しからずや・・

しゃみぃ

※otherScreenName は
Screen1.OtherScreenCloseをエディタに引っ張り出してくると
My Blocksタブの
My Definitions にあります。

Enjoy AppInventor Life
Reply all
Reply to author
Forward
0 new messages