代码之家  ›  专栏  ›  技术社区  ›  Bite code

为什么Android TabHost会从文本视图窃取焦点?

  •  6
  • Bite code  · 技术社区  · 15 年前

    我有一个使用以下布局的应用程序:

    alt text http://img15.imageshack.us/img15/238/screenshot003xbo.png

    当应用程序启动时,焦点在第一个文本视图上,但是如果您试图在其中键入任何字母,焦点将直接转到选项卡上。看来我不是唯一一个 fighting with this issue 可能与以下有关:

    http://groups.google.com/group/android-developers/browse_thread/thread/435791bbd6c550a/8022183887f38f4f?lnk=gst&q=tabs+focus#8022183887f38f4f

    不管怎样,你知道为什么会这样吗?当然,任何变通办法都会受到赞赏。


    我发布下面的代码以避免问题过载:

    XML:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <LinearLayout 
              android:padding="5px"
              android:orientation="vertical" 
              android:id="@+id/task_edit_panel"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
               android:layout_weight="50" >
            <LinearLayout android:orientation="vertical"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content">
                <TextView android:layout_width="wrap_content"
                    android:layout_height="wrap_content" 
                    android:text="@string/title" 
                    android:textStyle="bold" />
                <EditText android:id="@+id/title" 
                  android:layout_width="fill_parent"
                    android:layout_height="fill_parent" />
            </LinearLayout>
            <TabHost android:id="@+id/edit_item_tab_host"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"> 
                <TabWidget android:layout_width="fill_parent"
                            android:layout_height="wrap_content" 
                            android:id="@android:id/tabs" /> 
                <FrameLayout
                  android:id="@android:id/tabcontent"
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:paddingTop="65px"> <!--  you need that if you don't want the tab content to overflow --> 
                  <LinearLayout
                       android:id="@+id/edit_item_date_tab"
                       android:orientation="vertical"
                        android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:padding="5px" > 
                        <TextView android:layout_width="wrap_content"
                                android:layout_height="wrap_content" 
                                android:text="date" 
                                 android:textStyle="bold" />
                    </LinearLayout>
                    <LinearLayout
                       android:id="@+id/edit_item_geocontext_tab"
                       android:orientation="vertical"
                        android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:padding="5px" > 
                    <TextView android:layout_width="wrap_content"
                                android:layout_height="wrap_content" 
                                android:text="lieu" 
                                 android:textStyle="bold" />
                    </LinearLayout>
                    <LinearLayout
                       android:id="@+id/edit_item_text_tab"
                       android:orientation="vertical"
                        android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                         android:padding="5px"> 
                    <EditText android:id="@+id/details" 
                            android:layout_width="fill_parent"
                            android:layout_height="fill_parent"
                            android:scrollbars="vertical" />
                    </LinearLayout>
                </FrameLayout>
            </TabHost>
        </LinearLayout>
        <!-- Bottom pannel with "add item" button -->
        <LinearLayout 
              android:padding="5px"
              android:orientation="horizontal" 
              android:layout_weight="1"
              android:id="@+id/task_edit_panel"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:background="#E7E7E7" >
              <!--  Let the height set to fill_parent until we find a better way for the layout  -->
              <Button android:id="@+id/item_edit_ok_button"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="bottom"
                    android:text="@string/ok"
                    style="?android:attr/buttonStyleSmall"
                    android:layout_weight="1" />
               <Button android:id="@+id/item_edit_cancel_button"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="bottom"
                    android:text="@string/cancel"
                    style="?android:attr/buttonStyleSmall"
                    android:layout_weight="1" />
        </LinearLayout>
    </LinearLayout>
    

    Java代码:

        TabHost tab_host = (TabHost) findViewById(R.id.edit_item_tab_host);
         // don't forget this setup before adding tabs from a tabhost using a xml view or you'll get an nullpointer exception
        tab_host.setup(); 
    
        TabSpec ts1 = tab_host.newTabSpec("TAB_DATE");
        ts1.setIndicator(getString(R.string.when), getResources().getDrawable(R.drawable.ic_dialog_time));
        ts1.setContent(R.id.edit_item_date_tab);
        tab_host.addTab(ts1);
    
        TabSpec ts2 = tab_host.newTabSpec("TAB_GEO");
        ts2.setIndicator(getString(R.string.where),  getResources().getDrawable(R.drawable.ic_dialog_map));
        ts2.setContent(R.id.edit_item_geocontext_tab);
        tab_host.addTab(ts2);
    
        TabSpec ts3 = tab_host.newTabSpec("TAB_TEXT");
        ts3.setIndicator(getString(R.string.what),  getResources().getDrawable(R.drawable.ic_menu_edit));
        ts3.setContent(R.id.edit_item_text_tab);
        tab_host.addTab(ts3);
    
        tab_host.setCurrentTab(0);
    
    5 回复  |  直到 8 年前
        1
  •  7
  •   Bite code    15 年前

    好吧,显然是个虫子: http://code.google.com/p/android/issues/detail?id=2516 .

    希望它能在下一个版本中得到修复,因为对于具有高级布局的复杂应用程序来说,这是一个非常棘手的问题。

        2
  •  7
  •   Jon Egerton Aditya kumar sahoo    13 年前

    我也面临同样的问题,蜂窝,但找到了一个非常简单的解决方案。所以我认为有人分享我的经验是有帮助的。每次单击选项卡时,焦点都是编辑文本,您实际上可以使用硬键盘键入,但软键盘永远不会弹出。即使使用以下代码,它也无法解决问题:

    input1.requestFocusFromTouch();
    ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(input1, InputMethodManager.SHOW_FORCED);
    

    解决方案: 在处理选项卡的主类中,只需在Java代码下面写入:

    myTabHost.setOnTabChangedListener(new OnTabChangeListener(){    
        public void onTabChanged(String tabID) {    
            myTabHost.clearFocus(); 
        }   
    }); 
    
        3
  •  0
  •   Jeremy Logan    12 年前

    如果它与你指出的另一个错误没有关系(看起来可能是这样),如果你在G1S(而不是仿真器)上遇到这个问题,我怀疑你的问题是,在方向改变之前焦点没有被冻结(当你折叠键盘进入横向模式时),或者在视图变为R后焦点没有被冻结。创造了。您可以尝试重写活动的 OnSaveInstanceState()。 OnRestoreStanceState()。 保存/恢复焦点的方法。

        4
  •  0
  •   Oleksandr Bodashko    11 年前

    此示例演示如何解决此问题:

    userNameEditText.setOnTouchListener(new OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    userNameEditText.requestFocusFromTouch();
                    return false;
                }
            });
    
        5
  •  0
  •   Hardik Bamania    8 年前

    在添加所有规范之后,将requestfocus方法添加到 Java文件