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();
    }
}
Другие вопросы по тегам