1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

KKP(くるくるピ)にアプリを対応させる〜UI編

Last updated at Posted at 2016-02-06

UMAFocusManager

アプリをリモコンで操作する状況では、フォーカスがあたっているUIをハイライトさせたり、音声アシスト機能がないと、フォーカスがどこのUIを指しているのか分からない。その管理をUMAFocusManagerが行ってくれる。

UMAFocusManager focusManager = umaApplication.getFocusManager();

setFocusRoot

KKPコントローラのロータリースイッチや方向キーを使って、フォーカスを指定できる範囲をきめることができる。ループ選択にも対応してくれる。

focusManager.setFocusRoot((ViewGroup) findViewById(R.id.wrapper));
 <LinearLayout
        android:id="@+id/wrapper"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:id="@+id/A"
            android:text="A"
            android:contentDescription="A"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/B"
            android:text="B"
            android:contentDescription="B"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/C"
            android:text="C"
            android:contentDescription="C"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

requestFocusForView

フォーカスを当てハイライトさせるviewを指定


focusManager.requestFocusForView(findViewById(R.id.A));

ボイスフィードバック

UMATTSManagerが提供する機能で、メニューにフォーカスが当たると、そのメニューにつけられているタイトルを読み上げてくれる音声アシスト機能。デフォルトでは無効になっている。

有効


UMATTSManager ttsManager = (UMATTSManager)umaApplication.getUMAService(umaApplication.UMA_TTS_SERVICE);       
ttsManager.setEnabled(true);

android:contentDescription="読み上げる内容を記述"


   <Button
            android:id="@+id/A"
            android:text="A"
            android:contentDescription="A"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

エンター

KKPのエンターボタンを押せば、クリックイベントが呼ばれる。


 findViewById(R.id.A).setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "KKPのメインボタンが押された", Toast.LENGTH_SHORT).show();
            }
        });

listViewへの対応

(件名なし)_-info_yusuke_arai_gmail_com-_Gmail.png

MainActivity.java

  private UMAApplication umaApplication = UMAApplication.INSTANCE;
    private ListView mListView;
    private Context context;
    UMAFocusManager mFocusManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        umaApplication.create(this);
        UMAHIDManager HIDManager = (UMAHIDManager) umaApplication.getUMAService(UMAApplication.UMA_HID_SERVICE);
        if (HIDManager.isBLESupported()) {
            HIDManager.enableAutoConnection(5000, 5000, 5000);
            if (!HIDManager.connectLastConnectedDevice(5000)) {
                HIDManager.startDiscoverDevice();
            }
        }

        UMATTSManager ttsManager = (UMATTSManager)umaApplication.getUMAService(umaApplication.UMA_TTS_SERVICE);
        ttsManager.setEnabled(true);
        mFocusManager = umaApplication.getFocusManager();

        context = this;
        mListView = (ListView)findViewById(R.id.list_view);
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(MainActivity.this, mListView.getItemAtPosition(position).toString(), Toast.LENGTH_SHORT).show();
            }
        });
        mListView.setAdapter(new ListAdapter());
        mListView.setItemsCanFocus(true);

        mFocusManager.setFocusRoot((ViewGroup) findViewById(R.id.list_view));
    }
    private class ListAdapter extends BaseAdapter {

        public int getCount() {
            return 30;
        }

        public Object getItem (int position) {
            return "Item" + String.valueOf(position);
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {

            TextView textView;
            if (convertView == null) {
                LayoutInflater layoutInflater = LayoutInflater.from(context);
                convertView = layoutInflater.inflate(R.layout.sample_list_view_item, null);
                textView = (TextView)convertView.findViewById(R.id.text_view);
                convertView.setTag(textView);
            } else {
                textView = (TextView)convertView.getTag();
            }
            textView.setText("Item" + String.valueOf(position));
            convertView.setFocusable(true);
            return convertView;
        }
    }

sample_list_view_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:orientation="horizontal"
    >

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/image_view"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:textSize="20sp"
        android:padding="2dp"/>

</LinearLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">

    <ListView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/list_view"
        android:focusable="true"
        android:layout_alignParentStart="true" />
</LinearLayout>

Dialogへの対応

(件名なし)_-info_yusuke_arai_gmail_com-_Gmail.png


   super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        umaApplication.create(this);
        UMAHIDManager HIDManager = (UMAHIDManager) umaApplication.getUMAService(UMAApplication.UMA_HID_SERVICE);
        if (HIDManager.isBLESupported()) {
            HIDManager.enableAutoConnection(5000, 5000, 5000);
            if (!HIDManager.connectLastConnectedDevice(5000)) {
                HIDManager.startDiscoverDevice();
            }
        }

        UMATTSManager ttsManager = (UMATTSManager)umaApplication.getUMAService(umaApplication.UMA_TTS_SERVICE);
        ttsManager.setEnabled(true);

        mAlert = new AlertDialog.Builder(MainActivity.this)
                .setTitle("タイトル")
                .setMessage("こんにちは")
                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this, "OK", Toast.LENGTH_SHORT).show();
                    }
                })
                .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this, "キャンセル", Toast.LENGTH_SHORT).show();
                    }
                })
                .create();


        mAlert.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                View focusView = null;
                Button negativeButton = mAlert.getButton(AlertDialog.BUTTON_NEGATIVE);
                if (negativeButton != null) {
                    negativeButton.setFocusable(true);
                    negativeButton.setFocusableInTouchMode(true);
                    focusView = negativeButton;
                }

                Button positiveButton = mAlert.getButton(AlertDialog.BUTTON_POSITIVE);
                if (positiveButton != null) {
                    positiveButton.setFocusable(true);
                    positiveButton.setFocusableInTouchMode(true);
                    focusView = positiveButton;
                }
                if (focusView != null) {
                    UMAFocusManager focusManager = umaApplication.getFocusManager();
                    focusManager.pushState();
                    focusManager.setFocusRoot((ViewGroup) focusView.getRootView());
                    focusManager.requestFocusForView(focusView);
                }
            }
        });
        mAlert.show();  
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?