ãããããæ€èšäžã®åé¡ããé ãé¢ããèªè
ã«ã¯ãAndroidã·ã¹ãã èªäœãšãã®ããã«éçºãããã¢ããªã±ãŒã·ã§ã³ã®äž¡æ¹ã®ã€ã³ã¿ãŒãã§ãŒã¹ã®èšèšã¯äž»ã«èŠèŠçãªæçããšé
åã«çŠç¹ãåœãŠãŠãããããååã¯äžåçã«èŠããã§ããããããã€ã¹ã ãã ããèªç¶ã®æå¿ãŸãã¯ãããã®é
åããã¹ãŠæ¥œããæ©äŒã奪ãããã±ãŒã¹ã«ãã£ãŠããŠãŒã¶ãŒã®ã«ããŽãªãŒããããŸãã Androidã代æ¿ã®ããŸãã¯è¿œå ã®å¯Ÿè©±æ¹æ³ãæäŸããŠãããšããäºå®ã«ãããã·ã¹ãã ã®ã€ã³ã¿ãŒãã§ã€ã¹ãšåºæ¬æ©èœã¯ããã®ã«ããŽãªãŒã®ãŠãŒã¶ãŒã«ãšã£ãŠæ ¹æ¬çã«ã¢ã¯ã»ã¹ã§ããªããã®ã§ã¯ãããŸããã ã·ã¹ãã èšå®ã¡ãã¥ãŒã®ãã¢ã¯ã»ã·ããªãã£ãé
ç®ãšããã«å«ãŸãã
TalkBackã¢ããªã±ãŒã·ã§ã³ã¯ããã®ãããªã¢ã¯ã»ã·ããªãã£ã確ä¿ããããšã«å°å¿µããŠããŸãã ãµãŒãããŒãã£è£œã¢ããªã±ãŒã·ã§ã³ã®éèŠèŠçãªå¯çšæ§ã«ã€ããŠã¯ãã±ãŒã¹ããšã«ç°ãªããéçºè
ãç¹å¥ãªè¶
åªåã ãã§ãªããå°ãªããšã
åé¡ãžã®æäœéã®æ³šæãå¿
èŠãšããå Žåããã
ãŸã ã
éèŠèŠçãªã¢ã¯ã»ã·ããªãã£ã«ã€ããŠãã¹ããããAndroidã¢ããªã±ãŒã·ã§ã³ã®ãªã¹ããšã察å¿ããã³ã¡ã³ãã¯ãããšãã°
ããã«ãããŸã ã ãã¡ãããããã¯ã°ããŒãã«ãããã¯ãŒã¯äžã®å¯äžã®ãªã¹ãã§ã¯ãªããããããæã代衚çãªãªã¹ãã§ã¯ãããŸããããè°è«ãããŠããããšãæ確ã«ç€ºãäŸã®ãœãŒã¹ãšããŠäž»ã«åç
§ããŸãã ãããã®ã¢ããªã±ãŒã·ã§ã³ã®å€ãã®ã€ã³ã¿ãŒãã§ãŒã¹ã®éèŠèŠçãªã¢ã¯ã»ã·ããªãã£ã¯ãéçºè
ã®ç¹å¥ãªåªåã«ãããã®ã§ã¯ãªããã·ã¹ãã ã«çµã¿èŸŒãŸããã¡ã«ããºã ã®åãã®èªç¶ãªçµæã§ããããšã«æ³šæããŠãã ããã ã¢ããªã±ãŒã·ã§ã³éçºè
ã¯ããã«å¹²æžããŸããããããã ãã§ãªããããªãã®ã¡ãªããããããŸãã
ååãšããŠãã¢ããªã±ãŒã·ã§ã³ã®éèŠèŠçãªã¢ã¯ã»ã·ããªãã£ãžã®é
æ
®ã®é©åæ§ã«ã€ããŠã¯è©³ãã説æããŸããã ããã¯ä»ã®å Žæã§ååã«èšãããŠããŸãã Androidéçºè
ããã®æžå¿µã«ç¹ã«æ³šæãæã£
ãŠããã®ã¯ãç¹å¥ãªã¢ã¯ã»ã¹æ段ã®éçºã®æŽå²ã«ãã£ãŠå€æ
ã§ããããšã ãã§ãã çŽç²ã«æè¡çãªåŽé¢ã«çŠç¹ãåœãŠãŸãã å€ãã®å
žåçãªåé¡ãæ€èšãããããã解決ããæ¹æ³ã瀺ããŸãã èšãæããã°ããã®ãšãã»ã€ã¯äž»
ã«Androidã¢ããªã±ãŒã·ã§ã³ã®éçºè
ã察象
ãšããŠãã ãäœããã®çç±ã§ãèŠèŠçãªå¶éã«æ©ãŸãããŠãããŠãŒã¶ãŒã®ããŒãºãç¡èŠããªãããšã決å®ããŸããã
以éã®ãã¬ãŒã³ããŒã·ã§ã³ã§ã¯ããŠãŒã¶ãŒãšããã°ã©ããŒã®äž¡æ¹ã®èŠ³ç¹ãããèªè
ãAndroidã§äœ¿çšããã
ã€ã³ã¿ãŒãã§ãŒã¹ãžã®
éèŠèŠçã¢ã¯ã»ã¹ã®ååã«ã€ããŠããçšåºŠæ確ãªèããæã£ãŠããããšãåæãšããŠããããããã®ãããã¯ã«æ
£ããŠããªã人ã¯ãŸãåºæ¬æ
å ±ã®ããã€ãã®ãœãŒã¹ã«ç²Ÿéããããšããå§ãããŸãïŒ
以äžã®èæ
®äºé
ãšæšå¥šäºé
ã¯ãäž»ã«
TeamTalkãããžã§ã¯ãããåãããç¹å®ã®äŸã«ãã£ãŠç€ºããããµããŒããããŸããç¹ã«ãAndroidã¢ããªã±ãŒã·ã§ã³ã®ã¢ã¯ã»ã·ããªãã£ã®åé¡ã®è§£æ±ºã«é¢é£ããç§ã®åå ã§ãã
ãã¡ãããååãšããŠããããã¯ããã¹ãããã®æåéãã®æç²ã§ã¯ãããŸããã èªè
ãç¡é¢ä¿ãªè©³çŽ°ã§éå±ããããå³è§£ããã¢ã€ãã¢ãæãåžå¹ã«ããªãããã«ãããããå¯èœãªéãåçŽåããæã«ã¯ä¿®æ£ããããšããããŸãã çµå±ã®ãšãããç§ãã¡ã®æ€èšã®å¯Ÿè±¡ã¯ãã®ãããžã§ã¯ãèªäœã§ã¯ãªããäžè¬çãªAndroidã¢ããªã±ãŒã·ã§ã³ã«éåžžã«å
žåçãªéèŠèŠçãªã¢ã¯ã»ã·ããªãã£ã®åé¡ãšå¯èœãªè§£æ±ºçã§ãã
ãœãŒã¹ã³ãŒãã«ç²Ÿéããã人ã¯ãç©èªã«ä»éããããããªæœåºç©å
šäœãã
Githubã®æ£åœãªå¥œå¥å¿ãç°¡åã«æºããããšãã§ããŸãã
ãŠãããŒãµã«ãã¶ã€ã³ã®æŠå¿µãšå¥åº·çãªããããªãºã ã®åå
ã¢ããªã±ãŒã·ã§ã³ã®æ©èœã¯èšããŸã§ããªããã€ã³ã¿ãŒãã§ã€ã¹ã®éèŠèŠçãªã¢ã¯ã»ã·ããªãã£ã«ã€ããŠã¯ãèŠèŠçãªæçããçŸèŠ³ãæãªãããšã説ãããšã«ã¯ã»ã©é ãããšãããã«èšããªããã°ãªããŸããã ç¹ã«éçºè
ããã®åŠ¥åãç®ç«ã£ãç¹å¥ãªåªåãå¿
èŠãšããªãå Žåãã¢ã¯ã»ã·ããªãã£ãå¿ããããªãããšã䞻匵ããŸãã
ç§ã¯ã
ãŠãããŒãµã«ãã¶ã€ã³ã®
æŠå¿µãæ¯æããŠããŸããããã«ããã°ãã¢ããªã±ãŒã·ã§ã³ã€ã³ã¿ãŒãã§ãŒã¹ã¯ã
ãã¹ãŠã®ã«ããŽãªã®ãŠãŒã¶ãŒãçããã¢ã¯ã»ã¹ã§ããããšãçæ³ã§ãã ãããŠãŸã第äžã«
ãå¥å
šãªããããªãºã ã®
ååã䌎ãã¢ã¯ã»ã·ããªãã£ã確ä¿ããããã«ãã·ã¹ãã èªäœã«å¹²æžããå¿
èŠã¯ãã
ãŸãã ã
ã€ãŸããã€ã³ã¿ãŒãã§ã€ã¹ã®éçºæã«ãµãŒãããŒãã£ã®ã©ã€ãã©ãªã䜿çšããããç¬èªã®å®å
šã«ãªãªãžãã«ã®ã³ã³ãããŒã«ãäœæãããããèªæãããå Žåãèãå§ããã®ã¯è¯ãããšã§ããããã¯æ¬åœã«å¿
èŠã§ããïŒ Android SDKã¯ããã®çš®ã®éåžžã«è±å¯ãªããŒã«ã»ãããããã°ã©ãã«æäŸããŸããæ·±å»ãªçç±ããªãéãããããè¶
ããŠã¯ãªããŸããã ãšããã§ãããã¯ã¢ããªã±ãŒã·ã§ã³ã®å¯çšæ§ã ãã§ãªãããã®äºææ§ã«ãè¯ã圱é¿ãäžããŸãã
contentDescription
å±æ§ã«ã€ããŠ
ã¢ããªã±ãŒã·ã§ã³éçºè
ãèŠèŠçãªå¶éã®ãããŠãŒã¶ãŒã®ããã«ãéåŽãäœãç ç²ã«ããããšãªãã§ããæãç°¡åã§æçœãªããšã¯ã
contentDescription
å±æ§ãä»ããŠãã¹ãŠã®çŽç²ãªã°ã©ãã£ãã¯ã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ã«æ£ç¢ºã«çœ²åããããšã§ãã ãã ããæ®å¿µãªããããããè¡ã人ã¯ã»ãšãã©ããŸããã ãããŠããã®å±æ§ãæ£åœã«å°éããããšã¯ãäžè¬çãªæ
£è¡ã§ã¯ãªãã幞ããªäŸå€ã®ããã§ãã
contentDescription
ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ã€ã³ã¿ãŒãã§ãŒã¹ã®ã¢ã¯ã»ã·ããªãã£ãåäžãããããã®æšå¥šäºé
ã¯ãGoogleã®ç®¡çããã¥ã¡ã³ããšä»ã®ãœãŒã¹ã®äž¡æ¹ã«ãããããæ£çŽãªãšãããããäžåºŠæãåºãã®ã¯é¢åã§ãã ãããã®æšå¥šäºé
ã®ãã¹ãŠããæããã«åªããé©çšã«å€ããäžå€æ¡ä»¶ã§ç¡èŠãããªãå Žåãç§ã¯æ§ããŸãã
éçºè
ããã°ã©ãã£ãã¯ãã¿ã³ã«çœ²åããçŽæ¥ã®ãªã¯ãšã¹ãã«å¿ããŠãç»é¢ã«ååãªã¹ããŒã¹ããªããšèããããšããããŸãã ãã¡ããããã®ãããªçãã¯ãæåã«ããã°ã©ããŒã®å°éçãªç Žç£ã蚌æããŠããŸããããã°ã©ããŒã¯ãããã¥ã¡ã³ãã«å°ãæ
£ããããšããããã«ãæ¯figçã«èšãã°ãããã°ã©ã ãæžãã®ã§ã¯ãªãã倱æããŸãã ã¢ããªã±ãŒã·ã§ã³éçºè
ã®éã§éèåè
ã¯å€ããªããšä¿¡ãããã®ã§ã
contentDescription
ã
contentDescription
ããã
contentDescription
å±æ§
contentDescription
å®å
šã«ç¡å®³ã§
ãããã¢ããªã±ãŒã·ã§ã³ã®å€èŠ³ã«åœ±é¿ãäžã ããç»é¢äžã®ã¹ããŒã¹ãå¿
èŠãš
ããªãããšãå床匷調
ããŸã ã
ãã ããäžçã®ä»ã®ãã¹ãŠã®å Žåãšåæ§ã«ã
contentDescription
ã¯ç解ã«æºã¡ããã®ã§ãçä¿¡çã§ã¯
contentDescription
ãŸããã æ©æ¢°çã«èãã¬ã¢ãããŒãã¯ãå®å
šã«æãŸãããªãçµæãããããå¯èœæ§ããããŸãã
äŸã§èšãããããšã説æããŸãã ãŠãŒã¶ãŒã®ãªã¹ãã衚瀺ãããªã¹ãã¢ã€ãã ã«ã¯æ¬¡ã®ã¹ããŒã ããããšããŸãã
<LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true"> <ImageView android:id="@+id/usericon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/user" /> <TextView android:id="@+id/nickname" android:textSize="16sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" /> </LinearLayout>
ã芧ã®ãšããããã®å³ã®çŽç²ã«ã°ã©ãã£ãã¯ãª
ImageView
èŠçŽ ã«ã¯
contentDescription
å±æ§ããããŸããã ãããŠãããã¯å®å
šã«æèçã§ãã ããã§ã¯ããªã¹ãèŠçŽ ã¯å
šäœãšèŠãªãããŸããã€ãŸãããã®èŠçŽ ïŒ
ImageView
ããã³
TextView
ïŒã«ã¯ç¬ç«ãã圹å²ããããŸããã
clickable
å±æ§ãèšå®ãããŠããŸããã ç¹å¥ãªã¢ã¯ã»ã¹ãµãŒãã¹ã«å¿
èŠãªããã¹ãæ
å ±ã¯ãã¹ãŠ
TextView
ã«å«ãŸããŠããããã®å Žåã®
ImageView
ã¯ã»ãšãã©ã®å Žåè£
食çãªåœ¹å²ãæãããéèŠèŠçã¢ã¯ã»ã¹ã®èŠ³ç¹ããã¯æçšãªæ
å ±ãäŒããŸããã
ImageView
èŠçŽ ãå®éã«ãã¿ã³ãšããŠäœ¿çšãããŠããå Žåããããã¯ãªãã¯ãããšãŸã£ããåé¡ã«ãªããŸã
ä»»æã®ã¢ã¯ã·ã§ã³ã ãã®å Žåã
contentDescription
å±æ§ã¯éåžžã«åœ¹ç«ã¡ãŸãã
ããã§ããªã¹ãå
ã®ãŠãŒã¶ãŒãããªã³ã©ã€ã³ããšããªãã©ã€ã³ããªã©ã®ç°ãªãç¶æ
ã«ããå¯èœæ§ãããããããã®è¡šç€ºã®ããã«ç°ãªãè²ã䜿çšãããšããŸãã ãã®è¿œå æ
å ±ã
contentDescription
ã¢ã¯ã»ã¹ã§ããªãããã«ããã«ã¯ã
contentDescription
å±æ§ã圹ç«ã¡ãŸããä»åã¯ããªã¹ãã¢ããã¿ãŒã®èŠçŽ ã®è²ãšå
±ã«åçã«èšå®ããŸãã
å®è£
æ¹æ³ã¯æ¬¡ã®ãšããã§ãã
class UserListAdapter extends ArrayAdapter<User> { public UserListAdapter(Context context, int resource) { super(context, resource); } @Override public View getView(int position, View convertView, ViewGroup parent) { Context context = getContext(); LayoutInflater inflater = LayoutInflater.from(context); if (convertView == null) convertView = inflater.inflate(R.layout.item_user, null); User user = getItem(position); TextView nickname = (TextView) convertView.findViewById(R.id.nickname); nickname.setText(user.nickname); if (user.stateOnline) { convertView.setBackgroundColor(Color.rgb(133, 229, 141));
æååãªãœãŒã¹ã«ã¯å®çŸ©ããããšæ³å®ãããŸãã
<string name="user_state_online">%1$s online</string>
ãŠãŒã¶ãŒãããªã³ã©ã€ã³ãç¶æ
ã®å Žåã«ã®ã¿ãç¹å¥ãªã¢ã¯ã»ã¹ãµãŒãã¹ã«è¿œå æ
å ±ãæäŸããããšã«æ³šæããŠãã ããã ããã«ãããæ
å ±ã³ã³ãã³ããç ç²ã«ããããšãªãé³å£°ã¡ãã»ãŒãžã®éãåæžã§ããŸããããã¯ãèããããç¶æ
ã2ã€ãããªããããççŸãçºçããªãããã§ãã
é³å£°ã¡ãã»ãŒãž
ã¯ç¥èŠã«
æéãããããã ãæçšãªæ
å ±ãç ç²ã«ããããšãªãã
å¯èœãªéãããªã¥ãŒã ãæžããå¿
èŠããããŸãã
ãŸãã
contentDescription
çµåããã¹ããäœæããå Žåãèªèå¹çã®çç±ãããæã人æ°ã®ããæ
å ±ã¯
é³å£°ã¡ãã»ãŒãžã®å
é ã«é
眮ããå¿
èŠããããããã¹ããŒã¿ã¹ã®åã«ãŠãŒã¶ãŒåãé
眮
ããŸã ã
ã©ã€ãèŠçŽ ãå«ããªã¹ã
åã®æ®µèœã®äŸãæ€èšãç¶ãããšããŠãŒã¶ãŒã®ç¶æ
ãã¢ããªã±ãŒã·ã§ã³ãããæ£ç¢ºã«ã¯ãã®ã€ã³ã¿ãŒãã§ãŒã¹ã®å€éšã®äœããã®çç±ã§å€åãããšä»®å®ããããšã¯è«ççã§ãã ãããŠãå®éã®ç¶æ³ã«äžèŽããããã«ãç»é¢äžã®æ
å ±ãå®æçã«æŽæ°ããå¿
èŠããããŸãã
æ確ã«ããããã«ã次ã®å®è£
ãæ³å®ããŸãã
public class MainActivity extends Activity { private UserListAdapter userListAdapter; private CountDownTimer listUpdateTimer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); userListAdapter = new UserListAdapter(this, R.layout.item_user); listUpdateTimer = new CountDownTimer(10000, 1000) { @Override public void onTick(long millisUntilFinished) { userListAdapter.notifyDataSetChanged(); } @Override public void onFinish() { start(); } }; listUpdateTimer.start(); } }
ã€ãŸããç»é¢äžã®æ
å ±ã¯çŽ1ç§ã«1åæŽæ°ãããŸãã ãããããã®ãããªæŽæ°ã®ãã³ã«ããªã¹ãã¢ã€ãã ã¯ç¹å¥ãªã¢ã¯ã»ã¹ãµãŒãã¹ã«å¯Ÿå¿ããã€ãã³ããçæããå¯çšæ§ããªã¹ãã¢ã€ãã ã®1ã€ã«çŠç¹ãåœãŠãŠããå Žåããã®ã¢ã€ãã ã¯åžžã«è©±é¡ã«ãªããéåžžã®ãŠãŒã¶ãŒãšã¢ããªã±ãŒã·ã§ã³ãšã®ããåããã»ãŒå®å
šã«äžå¯èœã«ãªããŸãã ç¹å¥ãªã¢ã¯ã»ã¹æ段ã®é床ã®æçšæ§ãå°æ¥ã®ããã§ã¯ãªããç±ççãªçä¿¡ãåççãªå¶éãå¿
èŠãšããå ŽåããããŸãã
ãã®ããã«ãè£å©ã¯ã©ã¹ãå°å
¥ããŸãã
public class AccessibilityAssistant extends AccessibilityDelegate { private final Activity hostActivity; private volatile boolean eventsLocked; public AccessibilityAssistant(Activity activity) { hostActivity = activity; eventsLocked = false; }
ã€ã³ã¿ãŒãã§ã€ã¹ã®éèŠèŠçãªã¢ã¯ã»ã·ããªãã£ãç ç²ã«ããããšãªããç»é¢äžã®æ
å ±ã®ç¶ç¶çãªæŽæ°ãç°¡åã«å®è£
ã§ããŸãã
public class MainActivity extends Activity { private AccessibilityAssistant accessibilityAssistant; private ArrayAdapter userListAdapter; private CountDownTimer listUpdateTimer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); accessibilityAssistant = new AccessibilityAssistant(this); userListAdapter = new ArrayAdapter(this, R.layout.item_user) { @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_user, null); User user = getItem(position); TextView nickname = (TextView) convertView.findViewById(R.id.nickname); nickname.setText(user.nickname); if (user.stateOnline) { convertView.setBackgroundColor(Color.rgb(133, 229, 141)); nickname.setContentDescription(getString(R.string.user_state_online, user.nickname)); } else { convertView.setBackgroundColor(Color.rgb(0, 0, 0)); nickname.setContentDescription(null); }
ååãšããŠãã¿ã¹ã¯ã¯ãªã¹ãã¢ããã¿ãŒã®notifyDataSetChangedïŒïŒã¡ãœããããªãŒããŒã©ã€ãããããšã§è§£æ±ºã§ããŸãã
public void notifyDataSetChanged() { accessibilityAssistant.lockEvents(); super.notifyDataSetChanged(); accessibilityAssistant.unlockEvents(); }
ãã ãããã®ãªãã·ã§ã³ã¯ããŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ã«ãã£ãŠããªã¬ãŒãããå Žåã§ãããªã¹ãã®æŽæ°äžã«çºçããã€ãã³ãããããã¯ããããããããã«æªåããŸãã ç¹å¥ãªã¢ã¯ã»ã¹ã·ã¹ãã ã¯ããŠãŒã¶ãŒãèªåã®ã¢ã¯ã·ã§ã³ã«é©åã«å¿çã§ããããã«èšèšãããŠãããããäžè¬ã«ããã®ãããªããã¯ã¯æãŸãããããŸããã
è€éãªãªã¹ãã¢ã€ãã ãšåçãªæ
å ±
次ã«ããªã¹ãã®åèŠçŽ ã«ãã¿ã³ãé¢é£ä»ããããŠãããã€ãŸããããšãã°æ¬¡ã®ã¹ããŒã ã§èšè¿°ãããŠããç¶æ³ãèããŸãã
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true"> <ImageView android:id="@+id/usericon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/user" /> <TextView android:id="@+id/nickname" android:textSize="16sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true"> <Button android:id="@+id/msg_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_msg" android:focusable="false" android:clickable="true" /> </LinearLayout> </RelativeLayout>
ãªãµãŒãã¢ãŒãã§ãã®ãããªãªã¹ããã¿ããæäœãããšããªã¹ãèŠçŽ èªäœãšããã«ä»éãããã¿ã³ã®äž¡æ¹ã«ã¢ã¯ã»ã·ããªãã£ã®çŠç¹ãèšå®ã§ããŸãã
ããã«ããªã¹ãã«å ããŠãç»é¢ã«ã¯åžžã«å€åããæ
å ±ã衚瀺ãããŠãããšããŸãã ç°¡ç¥å³ã¯æ¬¡ã®ããã«ãªããŸãã
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/user_list" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/count_state" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0" android:singleLine="true" /> </LinearLayout>
ãããŠããã§ã«ç¢ºç«ãããŠããäŒçµ±ã«åŸã£ãŠãç§ãã¡ã¯æ¯ç§æŽæ°ãè¡ããŸãïŒ
public class MainActivity extends Activity { private int counter; private CountDownTimer updateTimer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); counter = 0; updateTimer = new CountDownTimer(10000, 1000) { @Override public void onTick(long millisUntilFinished) { ((TextView)findViewById(R.id.count_state)).setText(String.valueOf(++counter)); } @Override public void onFinish() { start(); } }; updateTimer.start(); } }
ãã®ç¶æ³ã§ã¯ãã¢ã¯ã»ã·ããªãã£ã®çŠç¹ããªã¹ãå
ã®ãã¿ã³ã®1ã€ã«ãããšãã«åé¡ãçºçããŸãã å®éãç»é¢äžã®æ
å ±ãæŽæ°ãããšãã«çºçããã€ãã³ããåŠçããåŸãç¹å¥ãªã¢ã¯ã»ã¹ãµãŒãã¹
ã¯ãã¿ã³ã§ã¯ãªããªã¹ãã¢ã€ãã äžã®äœçœ®
ã埩å
ã
ãŸã ã ãã®çµæãéåžžã«å°é£ã§ããããšãå€æããããé »ç¹ãªæŽæ°ã§ã¯ãéããžã¥ã¢ã«ã¢ã¯ã»ã¹ã¢ãŒãã§ãã¿ã³ãæŒãããšã¯å®å
šã«äžå¯èœã§ãã ãŸããåã®æ®µèœã§æ€èšããã€ãã³ããããã¯ã¯ãæ®å¿µãªããããã§ã¯åœ¹ã«ç«ã¡ãŸããã
ãã®è¿·æã«å¯ŸåŠããããã«ããã«ããŒã¯ã©ã¹ã®æ©èœããããã«æ¡åŒµããŸãã
public class AccessibilityAssistant extends AccessibilityDelegate { private final Activity hostActivity; private volatile boolean eventsLocked; private final AccessibilityManager accessibilityService;
ãŸããã¢ã¯ã»ã·ããªãã£ã®çŠç¹ããªã¹ãã«çµã¿èŸŒãŸãããã¿ã³ã«ããå Žåãç»é¢äžã®æ
å ±ãæŽæ°ããããšã¯é¿ããŸããããã¡ãããéããžã¥ã¢ã«ã¢ã¯ã»ã¹ã¢ãŒãã䜿çšãããŠããå Žåã®ã¿ã§ãã
public class MainActivity extends Activity { private AccessibilityAssistant accessibilityAssistant; private ArrayAdapter userListAdapter; private CountDownTimer updateTimer; private int counter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); accessibilityAssistant = new AccessibilityAssistant(this); counter = 0; userListAdapter = new ArrayAdapter(this, R.layout.item_user) { @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_user, null); User user = getItem(position); TextView nickname = (TextView) convertView.findViewById(R.id.nickname); Button button = (Button) convertView.findViewById(R.id.msg_btn); nickname.setText(user.nickname); if (user.stateOnline) { convertView.setBackgroundColor(Color.rgb(133, 229, 141)); nickname.setContentDescription(getString(R.string.user_state_online, user.nickname)); } else { convertView.setBackgroundColor(Color.rgb(0, 0, 0)); nickname.setContentDescription(null); }
ããã¯ãããã§äžããããç®ã«èŠããçµæãããããå¯äžã®ã¬ã·ãã§ããããšã«æ³šæããŠãã ããã ã€ãŸããã¢ã¯ã»ã·ããªãã£ã®çŠç¹ãã€ã³ã¿ãŒãã§ã€ã¹ã®ããã€ãã®èŠçŽ ã«ãããšããç»é¢ã®æŽæ°ã¯ããªãŒãºããŸãã ãã ããããã¯ç¹å¥ãªã¢ã¯ã»ã¹ã¢ãŒãã§ã®ã¿çºçããŸãã éåžžã¢ãŒãã§ã¯ãå¯äœçšã¯ãã
ãŸãã ã
é衚瀺ããŒãžã®ã€ãã³ã
å¥ã®èå³æ·±ãã±ãŒã¹ãã€ãŸãåãæ¿ãå¯èœãªã¿ãïŒãŸãã¯ããŒãžïŒã®äœ¿çšãèããŠã¿ãŸãããã
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1.0" > <android.support.v4.view.PagerTitleStrip android:id="@+id/pager_title_strip" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" android:background="#33b5e5" android:paddingBottom="4dp" android:paddingTop="4dp" android:textColor="#fff" /> </android.support.v4.view.ViewPager> </LinearLayout>
å®éã«ã¯ãããŒãžãã¹ã ãŒãºã«åãæ¿ããããã«ãã·ã¹ãã ã¯ç»é¢ã«è¡šç€ºãããŠãããã®ã ãã§ãªããããã«é£æ¥ãããã®ãæ£åžžã«æ©èœããŸãã ãŸãã衚瀺é åå€ã«ãããããã®é£æ¥ããŒãžã®æ
å ±ãæŽæ°ããå Žåãç¹å¥ãªã¢ã¯ã»ã¹ãµãŒãã¹ã«å¯Ÿå¿ããã€ãã³ããçæãããŸãã ããã¯ãã·ã¹ãã ã次ã®ããŒãžãæºåãããã®ããŒãžããã€ãã³ããæ¢ã«ããªã¬ãŒãããŠãããšãã«ãããããŒãžããå¥ã®ããŒãžã«ç§»åãããšãã«æã
çºçããŸãã ãã®çµæãé³å£°å¿çã¯ç»é¢ã«è¡šç€ºããããã®ãšäžèŽããŸããã
ãã®æãŸãããªãå¹æãåãé€ãããã«ãç¹å¥ãªã¢ã¯ã»ã¹ãµãŒãã¹ã®ã€ãã³ããããªã¬ãŒãã決å®ã¯éå±€ã®æäžäœã§è¡ãããããšãæãåºãã次ã®ããã«è£å©ã¯ã©ã¹ãéçºããŸãã
public class AccessibilityAssistant extends AccessibilityDelegate { private final Activity hostActivity; private final AccessibilityManager accessibilityService;
çŸåšãããŒãžã®å€æŽãå ±åããæéå
ã«ã®ã¿æ®ã£ãŠããŸãã
public class MainActivity extends Activity implements ViewPager.OnPageChangeListener { private AccessibilityAssistant accessibilityAssistant; private ViewPager viewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); accessibilityAssistant = new AccessibilityAssistant(this); viewPager = (ViewPager) findViewById(R.id.pager); viewPager.setOnPageChangeListener(this); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { accessibilityAssistant.setVisiblePage(position); } @Override public void onPageScrollStateChanged(int state) { } }
ãŸããããŒãž
ãæ
åœããåãã©ã°ã¡ã³ã
ã¯ç»é²ããå¿
èŠããããŸãã
public class PageFragment extends Fragment { @Override public void onViewCreated(View view, Bundle savedInstanceState) { ((MainActivity)getActivity()).accessibilityAssistant.registerPage(view, PAGE_NUMBER); super.onViewCreated(view, savedInstanceState); } }
ããã®
PAGE_NUMBER
ãã©ã¡ãŒã¿ãŒã¯ãå®éã«ã¯ããŒãžäœçœ®çªå·ãæå³ããŸãã
FragmentPagerAdapter.getItemïŒïŒã¡ãœããã®ãã©ã¡ãŒã¿ãŒãšåãã§ãã
ãããã«
ããã«æ瀺ãããŠããæ¹æ³ã®å€§éšåã¯æ¯æŽããããšãæå³ããŠããªãããã«èŠãããããããŸããããç¹å¥ãªã¢ã¯ã»ã¹ã·ã¹ãã ããã®æ
å ±ããŠãŒã¶ãŒã®æèã«æã¡èŸŒãã®ãé²ãããã ãã§ãã æ¬è³ªçã«ã¯ããã®ãšããã§ãã ããããéå°ãªæ
å ±ã¯ããã®äžè¶³ãšåãããã害ãäžããããšããããŸãã ç¹ã«ããããæããã«äžå¿
èŠã§ç¡é¢ä¿ãªå Žåã è¯ãã¹ããŒãã€ã³ã¿ãŒãã§ã€ã¹ã¯ã§ããã ã話ãå¿
èŠã¯ãªãããåžžã«ã¿ã€ã ãªãŒã«ããããŠæ¬è³ªçã«è©±ãã¹ãã ãšããããšãç¹°ãè¿ãããã¯ãããŸããã
æ®å¿µãªãããçµã¿èŸŒã¿ã®Androidã¹ã¯ãªãŒã³ãªãŒããŒ
TalkBackã¯å®ç§ãšã¯ã»ã©é ããã®ã§ãæ®å¿µãªãããã·ã¹ãã èªäœã®
ã¢ã¯ã»ã·ããªãã£APIãããã¯ããã«åçã«éçºãããŠããŸããã ã³ãã¥ããã£ã®éçºãžã®åå ã¯ã
å
¬éããããœãŒã¹ã³ãŒãã¯éåžžç¡é¢ä¿ã§ãããéçºããŒã ã¯æ奜家ã建èšçãªææ¡ããã®èšŽããåã«ç¡èŠãããšããäºå®ã«ãã£ãŠåŠšããããŠããŸãã
ãã ãããã®ãããã¯ã¯åå¥ã®æ€èšã«å€ããããããã®äœæ¥ã®ç¯å²å€ã§ãã éçºè
ã®æ³šæãã¢ããªã±ãŒã·ã§ã³ã®ã¢ã¯ã»ã·ããªãã£ã®åé¡ã«åŒãä»ããäžæ¹ã§ã¯äžè¬çãªæžå¿µãææããäžæ¹ã§ã¯åçŽãªãžã§ã¹ãã£ãŒã䜿çšããŠç¶æ³ã倧å¹
ã«æ¹åã§ããæ¹æ³ã瀺ãããã£ãã ãã§ãã å°ãªããšãããçšåºŠã¯æåãããšæããŸãã