Android: как сделать акцент на обновленном виде
Я загружаю данные в виде, имеющем 3 строки (LinearLayout
) с каждым рядом, имеющим 3 TextView
и обновление того же представления, если фокус на последнем TextView
ряда и KeyEvent.KEYCODE_DPAD_RIGHT
,
Я могу обновить вид на KeyEvent.KEYCODE_DPAD_RIGHT
но фокус не возвращается к той же строке обновленного представления.
Вопрос: Когда представление обновляется, я хочу, чтобы фокус оставался в той же строке обновленного представления,
,,,
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignTop="@id/linearlayout03" >
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="74dp"
android:background="@drawable/background" >
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="fill_parent"
android:layout_height="74dp"
android:background="@drawable/background" >
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout3"
android:layout_width="fill_parent"
android:layout_height="74dp"
android:background="@drawable/background" >
</LinearLayout>
</LinearLayout>
,,,
заполнить строки линейного макета
public void listfill(final LinearLayout ll, CustTextView[] tv, final List<Eventinfo> name, final int curf) {
final List<Eventinfo> nameref = name;
ll.removeAllViews();
if (name.size() == 0) {
name.add(new Eventinfo(true));
name.add(new Eventinfo(true));
name.add(new Eventinfo(true));
}
tv = new CustTextView[name.size()];
for (int i = 0; i < name.size(); i++) {
final Eventinfo evinfo = name.get(i);
Utils.println("ev info: "+evinfo);
tv[i] = new CustTextView(getApplicationContext());
LinearLayout.LayoutParams params2;
if (i != (name.size()-1)){
int x = 0;
if (i == 0){
tv[i].setViewLeft(true);
if (!name.get(0).isEmpty)
x = (int) calwidth(name.get(0).getEtime());
else
x = (int) calwidth(name.get(0).getDur() + 0);
}else
x = (int) calwidth(name.get(i).getDur() + 0);
params2 = new LinearLayout.LayoutParams(
(int) x, 74);
}
else{
tv[i].setViewRight(true);
params2 = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, 74);
}
tv[i].setLayoutParams(params2);
tv[i].setText(name.get(i).getName());
tv[i].setTextColor(Color.WHITE);
System.out.println(" .... " + name.get(i).getName() + i);
final int z = i;
tv[i].setOnFocusChangeListener(new methodOnFocusinlistfill(i, curf, nameref.get(i), tv[i].getisViewRight(), tv[i].getisViewLeft()));
tv[i].setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(z == 0){
String url = proxy.getUrl(gevinfo.getCid());
// call the tune channel API..
mediaPlayer.tune(url);
}
}
});
ll.addView(tv[i]);
}
}
Вышеприведенный метод вызывается для заполнения (обновления) представления о ключевом событии, приведенном ниже.
case KeyEvent.KEYCODE_DPAD_RIGHT:
if (( cur_focus == 8 || cur_focus == 9 || cur_focus == 10 ) && newRight //to check if it is the last textview){
stTime.add(Calendar.HOUR,1);
stTime.add(Calendar.MINUTE,30);
enTime.add(Calendar.HOUR,1);
enTime.add(Calendar.MINUTE,30);
getStimeAndEtime();// will gives the start and end time
getEventinforclist();// based on start and end time it will get the data for the respective time duration and calls fill layout to update the view
}
Пожалуйста, помогите и спасибо заранее.
2 ответа
Попробуйте вызвать метод requestFocus в представлении.
view.requestFocus();
Чтобы этот метод работал, ваш взгляд должен быть сфокусированным. установите для свойства focusable представления значение true в xml или программно.
Спасибо @sayed.jalil за помощь. Изменения, внесенные в приведенный выше код, включены в файл.xml.
android:descendantFocusability="afterDescendants"
android:focusable="false"
во всех трех LinearyLayout, чтобы фокус переместился на дочернее представление, которое является TextViews, и включил новый метод returnfocus() для запроса фокуса на основе текущего фокуса, который вызывается в
case KeyEvent.KEYCODE_DPAD_RIGHT:
if (( cur_focus == 8 || cur_focus == 9 || cur_focus == 10 ) && newRight //to check if it is the last textview){
stTime.add(Calendar.HOUR,1);
stTime.add(Calendar.MINUTE,30);
enTime.add(Calendar.HOUR,1);
enTime.add(Calendar.MINUTE,30);
getStimeAndEtime();// will gives the start and end time
getEventinforclist();// based on start and end time it will get the data for the respective time duration and calls fill layout to update the view
returnfocus();//new method added to retain the focus in same row
}
и метод returnfocus() есть,
public void returnfocus(){
System.out.println("current focus in returnfocus: "+cur_focus);
if (copycur == 8){
l1.requestFocus();
}else if (copycur == 9){
l2.requestFocus();
}else if (copycur == 10){
l3.requestFocus();
}
}