Почему Android TabHost ворует фокус из TextView? - PullRequest
6 голосов
/ 24 апреля 2009

У меня есть приложение, использующее следующий макет:

альтернативный текст http://img15.imageshack.us/img15/238/screenshot003xbo.png

Когда приложение запускается, основное внимание уделяется первому TextView, но если вы попытаетесь набрать в нем любую букву, фокус перейдет непосредственно к вкладкам. Кажется, я не единственный, борющийся с этой проблемой , и, возможно, это связано со следующим:

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 ]

7 голосов
/ 05 мая 2009

Ну, безусловно, ошибка: http://code.google.com/p/android/issues/detail?id=2516.

Надеюсь, что это будет исправлено в следующем выпуске, потому что это действительно раздражающая проблема для сложных приложений с расширенным макетом.

7 голосов
/ 30 декабря 2011

Я столкнулся с такой же проблемой с HoneyComb, но нашел очень простое решение. Поэтому я подумал, что кому-то может быть полезно поделиться своим опытом. Каждый раз, когда нажимается вкладка, основное внимание уделяется редактированию текста, и вы можете печатать с помощью жесткой клавиатуры, но софт-клавиатура никогда не появляется. Даже с кодом ниже, это не решило проблему:

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(); 
    }   
}); 
0 голосов
/ 12 ноября 2016

после добавления всех спецификаций добавьте метод requestFocus к вашему тексту редактирования в Java-файле

0 голосов
/ 27 февраля 2013

В этом примере показано, как решить эту проблему:

userNameEditText.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                userNameEditText.requestFocusFromTouch();
                return false;
            }
        });
0 голосов
/ 04 мая 2009

Если это не связано с той другой ошибкой, на которую вы указали (и похоже, что это возможно), и если вы испытываете это на G1s (а не на эмуляторе), я подозреваю, что ваша проблема в том, что фокус либо не замораживается до изменения ориентации (когда вы раскладываете клавиатуру и переходите в альбомный режим), либо не замораживается после повторного создания вида. Вы можете попробовать переопределить методы onSaveInstanceState () и onRestoreInstanceState () , чтобы сохранить / восстановить фокус.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...