###前提・実現したいこと
自分はプログラミング初心者です。説明が下手くそ(日本語も下手くそ)なのはご了承してください。
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を使用しています。
デザインはこんな感じです。
回答2件
あなたの回答
tips
プレビュー