I have a tabHost and a searchView on an activity which extends
TabActivity.
I found that the TabHost steals focus from the SearchView when I tap
on the SearchView. So it disables typing by an external hardware
keyboard.
It also occurs when it is developed by Fragment instead of TabHost.
My original source code and XMLs are like this :
===========================================
1. SearchViewFocusTestActivity.java
package com.infraware.tabtest;
import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.SearchView;
import android.widget.TabHost;
public class SearchViewFocusTestActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LayoutInflater inflater = this.getLayoutInflater();
inflater.inflate(R.layout.layout_tabhost,
(LinearLayout)findViewById(R.id.tabhost_layout), true);
Resources res = getResources();
final TabHost tabHost =
(TabHost)findViewById(android.R.id.tabhost);
tabHost.setup();
TabHost.TabSpec spec;
View indicator =
inflater.inflate(R.layout.frame_tab_contentview,
tabHost.getTabContentView(), true);
spec = tabHost.newTabSpec("A").setIndicator("tab1",
res.getDrawable( R.drawable.ic_launcher) ).setContent(R.id.tab1);
tabHost.addTab(spec);
spec = tabHost.newTabSpec("B").setIndicator("tab2",
res.getDrawable( R.drawable.ic_launcher) ).setContent(R.id.tab2);
tabHost.addTab(spec);
spec = tabHost.newTabSpec("C").setIndicator("tab3",
res.getDrawable( R.drawable.ic_launcher) ).setContent(R.id.tab3);
tabHost.addTab(spec);
}
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.mainmenu_home, menu);
return super.onCreateOptionsMenu(menu);
}
}
2. main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/
android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<LinearLayout
android:id="@+id/tabhost_layout"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
</LinearLayout>
3. mainmenu_home.xml
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_home_dummy_search"
android:showAsAction="always"
>
</item>
<item android:id="@+id/menu_home_search"
android:showAsAction="always"
android:iconifiedByDefault="false"
android:actionViewClass="android.widget.SearchView"
>
</item>
</menu>
4. layout_tabhost.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/
android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TabHost
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:orientation="vertical"
android:gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TabWidget>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</FrameLayout>
</LinearLayout>
</TabHost>
</LinearLayout>
5. frame_tab_contentview.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/
android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:id="@+id/tab1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:background="#ff0000">
</LinearLayout>
<LinearLayout
android:id="@+id/tab2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:background="#00ff00">
</LinearLayout>
<LinearLayout
android:id="@+id/tab3"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:background="#0000ff">
</LinearLayout>
</FrameLayout>
===========================================
I have googled a tip and modified onCreateOptionsMenu() on the source
like this :
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.mainmenu_home, menu);
final SearchView oSearchView =
(SearchView)menu.findItem(R.id.menu_home_search).getActionView();
oSearchView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
oSearchView.requestFocusFromTouch();
return true;
}
});
return super.onCreateOptionsMenu(menu);
}
But it gets the focus back only when I touch on the Search icon of the
expanded SearchView. In other cases, it happens same. So I have tried
to catch the only textfield of the expanded SearchView to control it
such as setting an OnTouchListener. But I could not.
Please help to solve this problem.
Thank you in advance.
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en