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

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

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

Android Wearとは、Googleが発表した腕時計型ウェアラブルデバイス(スマートウォッチ)向けのプラットフォームです。GoogleのAndroid OSをベースにしており、情報の入手・管理などを行うことができます。

Android Studio

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1851閲覧

Android Studio (Java) [Data Api] Handheldで表示させているListViewの内容をAndroid Wearに表示させたい

Yochan

総合スコア7

Android Wear

Android Wearとは、Googleが発表した腕時計型ウェアラブルデバイス(スマートウォッチ)向けのプラットフォームです。GoogleのAndroid OSをベースにしており、情報の入手・管理などを行うことができます。

Android Studio

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2017/02/03 10:30

編集2017/02/03 12:40

###前提・実現したいこと
自分はプログラミング初心者です。説明が下手くそ(日本語も下手くそ)なのはご了承してください。

Android Studio(Java)でListView(配列に表示させる内容を入れてます)を用いてHandheldに一覧表示させ、次にDataApiを用いてwearにその配列データを送りたいです。wearに配列データを送る方法がわかりません。
Handheld側で「課題一覧を送る」ボタンを押すと配列データが送られて、表示させるようにしたいです。

###該当のソースコード
///////////Handheld側のJavaコード//////////////

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, View.OnClickListener{ private static final String TAG = "Mobile#Main"; // リストビューに表示する期限 String[] c_code = new String[] { "8/1", "8/2", "8/6", "4/9" }; // リストビューに表示する科目 String[] c_name = new String[] { "国語", "算数", "理科", "社会" }; // GoogleApiクライエント private GoogleApiClient mGoogleApiClient = null; private EditText editText = null; // データを格納するためのArrayListを宣言 private ArrayList<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 課題の数分の繰り返し for(int i = 0; i< c_name.length; i++){ HashMap<String, String> map = new HashMap<String, String>(); // 提出期限をmapに代入 map.put("countrycode", c_code[i]); // 科目名をmapに代入 map.put("countryname", c_name[i]); // 作成したmapをdataに追加 data.add(map); } SimpleAdapter sa = new SimpleAdapter(this, data, R.layout.row, new String[]{"countrycode", "countryname"}, new int[]{R.id.countrycode, R.id.countryname} ); // main.xmlのListViewにsaをセットします。 ListView lv = (ListView)findViewById(R.id.listview); lv.setAdapter(sa); //GoogleApiClientのインスタンス生成 mGoogleApiClient = new GoogleApiClient .Builder(this) .addApi(Wearable.API) //接続成功と中断を監視するリスナーを登録 .addConnectionCallbacks(this) //接続失敗を監視するリスナーを登録 .addOnConnectionFailedListener(this) .build(); editText = (EditText)findViewById(R.id.editText); findViewById(R.id.sendButton).setOnClickListener(this); findViewById(R.id.send).setOnClickListener(this); } //フォアグラウンドに移行したタイミングで接続処理を行うメソッド @Override protected void onResume() { super.onResume(); mGoogleApiClient.connect(); } //バックグラウンド移行時に切断処理を行うメソッド @Override protected void onPause() { super.onPause(); if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) { mGoogleApiClient.disconnect(); } } //接続成功時のメソッド @Override public void onConnected(Bundle bundle) { Log.i(TAG, "onConnected"); } //接続中断時のメソッド @Override public void onConnectionSuspended(int i) { Log.i(TAG, "onConnectionSuspended"); } //接続失敗時のメソッド @Override public void onConnectionFailed(ConnectionResult connectionResult) { Log.i(TAG, "onConnectionFailed"); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.send: // 配列のデータ送信 sendArrayUsingDataApi(c_code[0].toString()); break; } } } //Data Apiを用いた配列データ送信処理 private void sendArrayUsingDataApi(String array) { PutDataMapRequest putDataMapReq = PutDataMapRequest.create(Config.DATA_PATH2); putDataMapReq.getDataMap().putString(Config.KEY_DATA2, array); PutDataRequest putDataReq = putDataMapReq.asPutDataRequest(); Wearable.DataApi.putDataItem(mGoogleApiClient, putDataReq); } }

///////////Wear側のJavaコード//////////////

public class KadaiList extends Activity implements DataApi.DataListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private static final String TAG = "Wear#Main"; // GoogleApiクライエント private GoogleApiClient mGoogleApiClient = null; private WearableListView mListView; private TextView text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_kadai_list); text = (TextView)findViewById(R.id.text1); mGoogleApiClient = new GoogleApiClient .Builder(this) .addApi(Wearable.API) //接続成功と中断を監視するリスナーを登録 .addConnectionCallbacks(this) //接続失敗を監視するリスナーを登録 .addOnConnectionFailedListener(this) .build(); } //フォアグラウンドに移行したタイミングで接続処理を行うメソッド @Override protected void onResume() { super.onResume(); mGoogleApiClient.connect(); } //接続成功時のメソッド @Override public void onConnected(Bundle bundle) { Log.i(TAG, "onConnected"); Wearable.DataApi.addListener(mGoogleApiClient, this); } //バックグラウンド移行時に切断処理を行うメソッド @Override protected void onPause() { super.onPause(); if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) { Wearable.DataApi.removeListener(mGoogleApiClient, this); mGoogleApiClient.disconnect(); } } //接続中断時のメソッド @Override public void onConnectionSuspended(int i) { Log.i(TAG, "onConnectionSuspended"); } //接続失敗時のメソッド @Override public void onConnectionFailed(ConnectionResult connectionResult) { Log.i(TAG, "onConnectionFailed"); } //Data Apiにより共有するデータの内容が変更されると呼ばれる @Override public void onDataChanged(DataEventBuffer dataEvents) { for (DataEvent event : dataEvents) { if (event.getType() == DataEvent.TYPE_CHANGED) { DataItem item = event.getDataItem(); if (item.getUri().getPath().equals(Config.DATA_PATH1)) { final DataMap dataMap1 = DataMapItem.fromDataItem(item).getDataMap(); runOnUiThread(new Runnable() { @Override public void run() { //Handheldで入力された文字に書き換える text.setText(dataMap1.getString(Config.KEY_DATA1)); } }); } else if (item.getUri().getPath().equals(Config.DATA_PATH2)) { final DataMap dataMap2 = DataMapItem.fromDataItem(item).getDataMap(); runOnUiThread(new Runnable() { @Override public void run() { //Handheldで表示されてる科目一覧を取得(配列)し、表示する mListView = (WearableListView) findViewById(R.id.wearable_list); mListView.setAdapter(new MyListAdapter(getApplicationContext(), dataMap2.getStringArrayList(Config.KEY_DATA2))); } }); } } else if (event.getType() == DataEvent.TYPE_DELETED) { } } } // Adapterをセットする時に使用するクラス private class MyListAdapter extends WearableListView.Adapter { private LayoutInflater mInflater; private List<String> mItems = null; public MyListAdapter(Context context, List items) { super(); mInflater = LayoutInflater.from(context); mItems = items; } @Override public WearableListView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { return new MyViewHolder(mInflater.inflate(R.layout.list_item_main, null)); } @Override public void onBindViewHolder(WearableListView.ViewHolder viewHolder, int position) { MyViewHolder myViewHolder = (MyViewHolder) viewHolder; myViewHolder.text.setText(mItems.get(position)); } @Override public int getItemCount() { return mItems.size(); } } private static class MyViewHolder extends WearableListView.ViewHolder { public TextView text; public MyViewHolder(View v) { super(v); text = (TextView) v.findViewById(R.id.name); } } }

###試したこと
まずこの時点でエラーは出てないです。おそらく間違っている所はHandheld側Javaコードの、配列のデータ送信をしようとしたコードです(sendArrayUsingDataApi(c_code[i].toString()); )。自分が作ったsendArrayUsingDataApi関数が配列を入れるような形じゃないと思われます。
Wear側のJavaコードの、送られてきた配列データを表示させようとしてるところも怪しいです。
###補足情報(言語/FW/ツール等のバージョンなど)
Android Studio 2.0を使用しています。
デザインはこんな感じです。
イメージ説明
イメージ説明

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

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

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

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

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

yona

2017/02/03 11:57

コードはコード用の記述に修正してください。
Yochan

2017/02/03 12:26

かしこまりました!
guest

回答2

0

データは本当に送られているのでしょうか?

pathがwearとhandheldで合わせているように見えないのですが...

投稿2017/02/03 13:34

aja

総合スコア3733

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

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

Yochan

2017/02/03 15:46

Handheld側でedittextで入力された値をwearに表示させる事はできたのですが。。。 配列データを送るとなると分からなくなってしまいました。。。 データを格納するパスとキーは合っていると思うのですが、どこが合ってないでしょうか?
aja

2017/02/05 01:53

Config.DATA_xxx の中がはっきり見えないので これはDataApiのポイントなのではっきり明示したほうがいいでしょう Stringと配列であれば簡単にはこうなりますが handheld: String[] c_name = new String[] {"国語", "算数", "理科", "社会"}; ... putDataMapReq.getDataMap().putStringArray("CNAME", c_name); wear: DataMapItem dataItem = DataMapItem.fromDataItem (event.getDataItem()); String[] data = dataItem.getDataMap().getStringArray("CNAME"); 文字列、配列、ArrayListの使い方を理解しましょう
guest

0

ベストアンサー

あまり詳しく無いですが、DataMap#putStringArrayを使って二個の配列を設定するといいんじゃ無いでしょうか?
また、Wear側にデータは到達していますか?

投稿2017/02/03 12:39

yona

総合スコア18155

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

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

Yochan

2017/02/03 12:41

データは到達しているようです!ただ、配列を格納する型が合ってないのかもしれません。 試してみます!
Yochan

2017/02/03 12:45

Handheld側のJavaコード最後の方の関数で、 putDataMapReq.getDataMap().putStringArray(Config.KEY_DATA2, array); と書いてみました。最後のarrayに赤線が引かれました。 private void sendArrayUsingDataApi(String array) { 関数の中身 } ()の中身のStringを変えなきゃだめなのでしょうか?
yona

2017/02/03 12:55

赤線が引かれましたではわかりません、詳細なエラーメッセージを書いてください。
Yochan

2017/02/03 15:51

wrong 2nd argument type, found: 'java.lang.String', required:'java.lang.String[]' putStringArray (String, java.lang.String[]) in DataMap cannot be applied to (String.java.lang.String) と書かれました。
yona

2017/02/03 17:10

String配列の引数にStringを渡したらダメですよ。
Yochan

2017/02/03 18:52

どういう意味でしょうか...?
Yochan

2017/02/03 19:03

//Data Apiを用いたテキストデータ送信処理 private void sendDatabyUsingDataApi(String text) { //データを格納するパスを指定する PutDataMapRequest putDataMapReq = PutDataMapRequest.create(Config.DATA_PATH1); //値を格納するためのマップを取得する。キーとバリューを設定する putDataMapReq.getDataMap().putString(Config.KEY_DATA1, text); //PutDataRequestのインスタンスを取得する PutDataRequest putDataReq = putDataMapReq.asPutDataRequest(); //データの送信 Wearable.DataApi.putDataItem(mGoogleApiClient, putDataReq); } 上記はHandheld側がedittextの内容をwearに送る際に作った関数なのですが、これとどのように違ってくるのでしょうか?これは正常に動きました。
yona

2017/02/04 00:40

putStringArrayは引数にStringの配列をとります、そこにStringを渡したらダメですよ。 エラーメッセージで検索しましたか?聞く前に自分で調べましょう。
Yochan

2017/02/04 01:34

エラーメッセージを見てもわからないから聞いてるのですが。。。
Yochan

2017/02/04 02:42

private void sendArrayUsingDataApi(String[] array) { PutDataMapRequest putDataMapReq = PutDataMapRequest.create(Config.DATA_PATH2); putDataMapReq.getDataMap().putStringArray(Config.KEY_DATA2, array); PutDataRequest putDataReq = putDataMapReq.asPutDataRequest(); Wearable.DataApi.putDataItem(mGoogleApiClient, putDataReq); } 引数にString配列を取るというのはこんな感じでしょうか!
yona

2017/02/04 02:59

そんな感じです。
Yochan

2017/02/04 03:02

とりあえず上記で実行してみました。そしたらHandheldで配列を送信するボタンを押してもwear側では何も反応しません。 受け取ったデータを表示させるコードが違うのでしょうか? final DataMap dataMap2 = DataMapItem.fromDataItem(item).getDataMap(); runOnUiThread(new Runnable() { @Override public void run() { //Handheldで表示されてる科目一覧を取得(配列)し、表示する mListView = (WearableListView) findViewById(R.id.wearable_list); mListView.setAdapter(new MyListAdapter(getApplicationContext(), dataMap2.getStringArrayList(Config.KEY_DATA2))); } });
Yochan

2017/02/04 03:02

上記はwear側のコードです。
yona

2017/02/04 03:24

まず、Wear側のrunメソッドの先頭でログ出力を行なってデータが来ているかを確認してください。 また、送信側のプログラムは質問のプログラムですか?
Yochan

2017/02/04 03:35

KEY_DATA2をログ出力しても何も反応しませんでした。データが来ていないのでしょうか。。。 そうです!
Yochan

2017/02/04 03:35

Log.d("log", Config.KEY_DATA2);
Yochan

2017/02/04 03:41

まずログを書く位置があっているのかもわかりません笑 wearコード側のpublic void onDataChangedの中に書けば良いのでしょうか
yona

2017/02/04 03:41

同じことをプログラムを文字列を1つ送っていた状態に戻して試してください。
Yochan

2017/02/04 04:05

データは来ているようです。
Yochan

2017/02/04 04:06

配列を送るメソッドでもデータは来ていました。
Yochan

2017/02/04 04:10

ただ気になるのは起動した時点で、KEY_DATA2が送られていました。 文字列を送る方はちゃんと送信ボタンを押してからログ出力されてました。
yona

2017/02/04 08:11

送る処理をどこに書いたんですか? onClick内に書かないとダメですよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問