Android: How to bring focus to the updated view

836 Views Asked by At

I am loading data in a view having 3 rows(LinearLayout) with each row having 3 TextView, and updating the same view if the focus is on last TextView of a row and KeyEvent.KEYCODE_DPAD_RIGHT.

I am able to update the view on KeyEvent.KEYCODE_DPAD_RIGHT but the focus is not coming back to the same row of the updated view.

Question: When the View is updated i want the focus to remain in the same row of the updated view,

. . .

  <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>

. . .

to fill the rows of linear layout

 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]);
            }
}

the above method is called to fill(Update) view on key event given below

  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
            }

Please help and thanks in advance.

2

There are 2 best solutions below

3
Sayed Jalil Hassan On

Try calling the requestFocus method on the view.

    view.requestFocus();

For this method to work, your view need to be focusable. set the focusable property of the view to true in xml or programatically.

0
bala On

thanks to @sayed.jalil for help, The changes made in above code is in .xml file included

      android:descendantFocusability="afterDescendants"
      android:focusable="false"

in all the three LinearyLayout so that the focus will move to the child view which are TextViews, and included new method 'returnfocus()' to request focus based on current focus, which is called in

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
        }

and returnfocus() method is,

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();
    }
}