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への対応
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への対応
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();