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

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

ただいまの
回答率

90.51%

  • Android Studio

    3711questions

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

  • 配列

    525questions

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

  • Android Wear

    42questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 489

Yochan

score 1

前提・実現したいこと

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

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を使用しています。
デザインはこんな感じです。
![イメージ説明](d66b910112b9e3c33905b951a333d179.png)
イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • yona

    2017/02/03 20:57

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

    キャンセル

  • Yochan

    2017/02/03 21:26

    かしこまりました!

    キャンセル

回答 2

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/03 21:41

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

    試してみます!

    キャンセル

  • 2017/02/03 21:45

    Handheld側のJavaコード最後の方の関数で、
    putDataMapReq.getDataMap().putStringArray(Config.KEY_DATA2, array);
    と書いてみました。最後のarrayに赤線が引かれました。

    private void sendArrayUsingDataApi(String array) { 関数の中身 }
    ()の中身のStringを変えなきゃだめなのでしょうか?

    キャンセル

  • 2017/02/03 21:55

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

    キャンセル

  • 2017/02/04 00: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)
    と書かれました。

    キャンセル

  • 2017/02/04 02:10

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

    キャンセル

  • 2017/02/04 03:52

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

    キャンセル

  • 2017/02/04 04: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に送る際に作った関数なのですが、これとどのように違ってくるのでしょうか?これは正常に動きました。

    キャンセル

  • 2017/02/04 09:40

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

    キャンセル

  • 2017/02/04 10:34

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

    キャンセル

  • 2017/02/04 11: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配列を取るというのはこんな感じでしょうか!

    キャンセル

  • 2017/02/04 11:59

    そんな感じです。

    キャンセル

  • 2017/02/04 12: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)));
    }
    });

    キャンセル

  • 2017/02/04 12:02

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

    キャンセル

  • 2017/02/04 12:24

    まず、Wear側のrunメソッドの先頭でログ出力を行なってデータが来ているかを確認してください。

    また、送信側のプログラムは質問のプログラムですか?

    キャンセル

  • 2017/02/04 12:35

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

    そうです!

    キャンセル

  • 2017/02/04 12:35

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

    キャンセル

  • 2017/02/04 12:41

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

    キャンセル

  • 2017/02/04 12:41

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

    キャンセル

  • 2017/02/04 13:05

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

    キャンセル

  • 2017/02/04 13:06

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

    キャンセル

  • 2017/02/04 13:10

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

    キャンセル

  • 2017/02/04 17:11

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/04 00:46

    Handheld側でedittextで入力された値をwearに表示させる事はできたのですが。。。

    配列データを送るとなると分からなくなってしまいました。。。
    データを格納するパスとキーは合っていると思うのですが、どこが合ってないでしょうか?

    キャンセル

  • 2017/02/05 10: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の使い方を理解しましょう

    キャンセル

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

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

関連した質問

  • 受付中

    TabHostについて

    AndroidのTabHostについて質問です。  @Override   protected void onCreate(Bundle savedInstanceState) {

  • 受付中

    Androidでのボタン処理

    前提・実現したいこと Androidスマートフォンで、STARTボタンをタップすると2秒後に画面上に加速度センサーの値を表示し、STOPボタンを押すと表示を止める、ということをし

  • 解決済

    【SQLite】editTextに入力した内容を、Listviewに表示させたい

    SQLiteを利用し、editTextに入力した内容をListviewに表示させたいです。 ですがエラーコードが下記の通り出てしまい、上手くいきません。 エラー内容を調べてみた

  • 解決済

    MessageAPIでhandleからwearに値を送りたい

    前提・実現したいこと MessageAPIを利用して送信する方法が分からなくて詰まっています。 mobile\SubActivity.java内のIntsumKidoの値をwe

  • 解決済

    GPS検索の中止処理を実装方法を教えてください

    いつもお世話になっています。 Android で GPS 検索を行うシステムの勉強をしています。 LocationManager の requestLocationUpdate

  • 解決済

    ListViewでのCheckBoxにチェックが付かない

    前提・実現したいこと 現在ListViewで一覧を表示しているのですが、項目のLongClickからチェックボックスが表示され、複数選択出来るようなものを作りたいと思っています。

  • 解決済

    android opencvで輪郭描画

    私はandroidstudioでアプリ開発を行っています。 実現したいこと opencvで赤い色を検知して赤色を白に、それ以外を黒にしてそのあとに赤い物の輪郭の中心座標を返した

  • 解決済

    アニメーションを連続で表示したい

    現在作成中のアプリにアニメーションを実装しようとしています アクティビティにはボタンと画像が一つづつ配置されています ボタンを押すと画像がAからBの位置に移動するアニメーションを実

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

  • Android Studio

    3711questions

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

  • 配列

    525questions

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

  • Android Wear

    42questions

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