Tab can not navigate and Tabs hide behind the main screen - android

In my android app main screen has couple of panel. In the first panel consist of two tab, which display the predefine database information as a list view. Problem is when the main screen show the database information it overlay the two tab, basically tab function is not reachable anymore. Is there any way to give line space or clear distinction before textview ? Please see the image file. Thanks for any suggestion or recommendation.
XML code:
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingTop="0px" >
<TabWidget
android:id="#android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center" />
<FrameLayout
android:id="#android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</FrameLayout>
</TabHost>
Java Code
super.onCreate(savedInstanceState);
setContentView(R.layout.event_panel);
TabHost tabHost = getTabHost();
TabSpec spec1 = tabHost.newTabSpec("Tab 1");
spec1.setIndicator("Text-1");
Intent in1 = new Intent(this, Tab1.class);
spec1.setContent(in1);
TabSpec spec2 = tabHost.newTabSpec("Tab 2");
spec2.setIndicator("Text-2");
Intent in2 = new Intent(this, Tab2.class);
spec2.setContent(in2);
tabHost.addTab(spec1);
tabHost.addTab(spec2);
tabHost.getTabWidget().getChildAt(0).setLayoutParams(new LinearLayout.LayoutParams(160, 35));
tabHost.getTabWidget().getChildAt(1).setLayoutParams(new LinearLayout.LayoutParams(160, 35));

It seems you set the layout programmaticly try to change the height at this line:
tabHost.getTabWidget().getChildAt(0).setLayoutParams(new LinearLayout.LayoutParams(290, 35));
35 seems to small, pick a higher number that should solve it I guess

Related

how to add the data of all the tabs into database using a single button click in android

There is five EditText widget placed in first tab, five EditText widget placed in second tab and five EditText widget placed in third tab. Now i want to add the data of all the tabs into database by clicking on a single button.
The button is not inside the tab layout. its inside the linear layout...
The xml tree structure is like this:
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffff" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TabWidget
android:id="#android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="#android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="300dp" >
</FrameLayout>
<Button
android:id="#+id/submit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Submit" />
</LinearLayout>
</TabHost>
Yes don't put a button at the end of each activity of the tabcontent. What you do is instead of taking 3 separate Activities don't take any internal sub activities. In your main Activity, Inflate all the layouts(which you are setting as content view for activities) and set them as content for the 3 Tabs. Then you will have 3 Views which are inflated. Now Create the EditTexts object with respect to view perspective and use them when clicked on the button. Hope you understand my Idea. And more importantly it is not suggested to use Activities as contents of Tabs as they consume more memory. I know there are many tutorials which follow the same but hide the drawback.
I have inflated three activity. all all the three activity contains EditTexts. The code is as follows:
TabHost tabHost = getTabHost();
// Tab for Photos
TabSpec photospec = tabHost.newTabSpec("Photos");
photospec.setIndicator("General", getResources().getDrawable(R.drawable.icon_photos_tab));
Intent photosIntent = new Intent(this, PhotosActivity.class);
photospec.setContent(photosIntent);
// Tab for Songs
TabSpec songspec = tabHost.newTabSpec("Songs");
// setting Title and Icon for the Tab
songspec.setIndicator("Private", getResources().getDrawable(R.drawable.icon_songs_tab));
Intent songsIntent = new Intent(this, SongsActivity.class);
songspec.setContent(songsIntent);
// Tab for Videos
TabSpec videospec = tabHost.newTabSpec("Videos");
videospec.setIndicator("Other", getResources().getDrawable(R.drawable.icon_videos_tab));
Intent videosIntent = new Intent(this, VideosActivity.class);
videospec.setContent(videosIntent);
// Adding all TabSpec to TabHost
tabHost.addTab(photospec); // Adding photos tab
tabHost.addTab(songspec); // Adding songs tab
tabHost.addTab(videospec); // Adding videos tab
I have added EditText in all 3 tabs and i want to add the data of all 3 tab(Containing EditText) to database by clicking on a single button. and the button is in main.xml
The output is as bellow:

Centering Tab Names On Android

I have followed the official HelloTabWidget Android tutorial and it works perfectly. Next I removed the tab icons and it still works perfectly. Now I would like to center the tabtext both horizontally and vertically in each tab, but I am clueless how. I've tried searching but couldn't find a solution.
I've tried adding android:layout_gravity to my main.xml file but it didn't help.
This is my onCreate main.java file:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TabHost tabHost = getTabHost(); // The activity TabHost
TabHost.TabSpec spec; // Resusable TabSpec for each tab
Intent intent; // Reusable Intent for each tab
intent = new Intent().setClass(this, Indkobsliste.class);
spec = tabHost.newTabSpec("tab1").setIndicator("Tab1")
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, Opskrifter.class);
spec = tabHost.newTabSpec("tab2").setIndicator("Tab2")
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, Madplan.class);
spec = tabHost.newTabSpec("tab3").setIndicator("Tab3")
.setContent(intent);
tabHost.addTab(spec);
tabHost.setCurrentTab(1);
}
This is the main.xml file:
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp">
<TabWidget
android:id="#android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<FrameLayout
android:id="#android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp"/>
</LinearLayout>
</TabHost>
This is how my tabs look now:
If you are running Android API Level >= 4, you can use TabHost.TabSpec.setIndicator(View view). This allows you to specify any view, so just provide one where you vertically center your text.
If, however, you are running a lower API level, try using the answer from this other stackoverflow question. It suggests using reflection to set the view even though the API does not publish the required setIndicator method.

Alternatives to using an activity for each tab

The scenerio is like this. Currently I am using the following code
TabSpec setContent = tabhost.newTabSpec("tab")
.setIndicator("tabview")
.setContent(new Intent(tabhost.getContext(), someActivity.class));
But I am told that each tab should not be associated with an activity and we must follow code something like this.
TabSpec setContent = tabhost.newTabSpec("tab").setIndicator("tabView").setContent(R.id.layout)
Consider a scenario where tab1 calls camera app, tab2 parses an XML and tab3 does some other display work. How do I solve this ? Because as soon as tab is changed I must call these methods. How do I create a single activity and assign all responsibilities to it ?
You can create a single activity with tabs that show only views. The only catch is that the views have to be defined inside the tag.
<FrameLayout
android:id="#android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView
android:id="#+id/list1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"/>
<ListView
android:id="#+id/list2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1" />
</FrameLayout>
Then, when inside your onCreate in your TabActivity:
TabHost tabs = getTabHost();
TabHost.TabSpec commentsTab = tabs.newTabSpec(TAB_TAG_1);
tabs.addTab(commentsTab.setContent(R.id.list1));
TabHost.TabSpec infoTab = tabs.newTabSpec(TAB_TAG_2);
tabs.addTab(infoTab.setContent(R.id.list2));
Note that I did not specify indicators for either tab, in the interests of space.

Android TabHost Layout Question

This is my first tabbed application for Android. I walked through the "HelloTabWidget" app on androids website, but I can't figure out how to add content to the tabs. The FrameLayout stacks stuff on top of each other to the top left (from what I've read). I added a couple of textviews and an imageView, but it only displays the last item added. Is there a way to use Linear Layout instead of Frame Layout? If not, how can you place multiple views in the tab? The only thing I have done different from the example is I added a 4th tab. In one of the tab Activities I inserted the following code to try to get multiple items to display:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textview = new TextView(this);
textview.setText("This is the About tab");
setContentView(textview);
TextView textview2 = new TextView(this);
textview2.setText("About Test");
setContentView(textview2);
ImageView imgView = new ImageView(this);
imgView.setImageDrawable(getResources().getDrawable(R.drawable.header));
setContentView(imgView);
}
Here is the link to the example I followed:
http://developer.android.com/resources/tutorials/views/hello-tabwidget.html
What is your layout xml file? I use this and I can stack several textview in every tab. TabActivity:
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ScrollView android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TabWidget android:id="#android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<FrameLayout android:id="#android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
</ScrollView>
</TabHost>
Activity inside tab:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView android:id="#+id/textOne"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView android:id="#+id/textTwo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<LinearLayout>
I'm a newbie myself, so there might be a better way to do it. This works for me, though.
You didn't read the example carefully. Take a look at the point number 6; you will see something like:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Resources res = getResources(); // Resource object to get Drawables
TabHost tabHost = getTabHost(); // The activity TabHost
TabHost.TabSpec spec; // Resusable TabSpec for each tab
Intent intent; // Reusable Intent for each tab
// Create an Intent to launch an Activity for the tab (to be reused)
intent = new Intent().setClass(this, ArtistsActivity.class);
// Initialize a TabSpec for each tab and add it to the TabHost
spec = tabHost.newTabSpec("artists").setIndicator("Artists",
res.getDrawable(R.drawable.ic_tab_artists))
.setContent(intent);
tabHost.addTab(spec);
// Do the same for the other tabs
intent = new Intent().setClass(this, AlbumsActivity.class);
spec = tabHost.newTabSpec("albums").setIndicator("Albums",
res.getDrawable(R.drawable.ic_tab_albums))
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, SongsActivity.class);
spec = tabHost.newTabSpec("songs").setIndicator("Songs",
res.getDrawable(R.drawable.ic_tab_songs))
.setContent(intent);
tabHost.addTab(spec);
tabHost.setCurrentTab(2);
}
That's what you put in the onCreate for the TabActivity. As you can see it has 3 activities. What you are doing is using JUST ONE activity and setting the content view 3 times, which is obviously wrong.
So... how to make it work? First, read again the tutorial. Second, create one activity for each tab you want to show. And use the model above to add those activities to your TabHost.

TabWidget - How to set position of indicator text?

i'm trying to use TabHost and TabWidget in my Android application. This is my layout main.xml:
<TabHost
android:id="#+id/mainTabHost"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<TabWidget android:id="#android:id/tabs" android:layout_width="fill_parent" android:layout_height="65px"/>
<FrameLayout
android:id="#android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:id="#+id/contentTags"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
</LinearLayout>
<LinearLayout
android:id="#+id/contentPreferences"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
</LinearLayout>
</FrameLayout>
</TabHost>
And my code:
final TabHost mainTabHost = (TabHost) this.findViewById(R.id.mainTabHost);
mainTabHost.setup();
final TabHost.TabSpec tabSpecTags = mainTabHost.newTabSpec("tabTags");
tabSpecTags.setIndicator(this.getString(R.string.tab_name_tags));
tabSpecTags.setContent(R.id.contentTags);
mainTabHost.addTab(tabSpecTags);
final TabHost.TabSpec tabSpecPreferences = mainTabHost.newTabSpec("tabPreferences");
tabSpecPreferences.setIndicator(this.getString(R.string.tab_name_preferences));
tabSpecPreferences.setContent(R.id.contentPreferences);
mainTabHost.addTab(tabSpecPreferences);
The problem is that i do not want my tabs to be so tall (65px). However, if i set the layout_height of the TabWidget to e.g. 30px, i can't see the tab labels (indicator) on the tabs at all.
Seems like there is a "minimum required" height for the TabWidget (65px?) and the indicator is positioned at the bottom of this 65px?
Is there a way to adjust the positioning of the indicator?
Thanks!
However, if i set the layout_height of
the TabWidget to e.g. 30px, i can't
see the tab labels (indicator) on the
tabs at all.
Note that the techniques for doing this won't necessarily be reliable in future Android releases, if they change up how a TabHost is constructed.
Is there a way to adjust the
positioning of the indicator?
Starting with API Level 4 (a.k.a., Android 1.6), TabHost.TabSpec accepts a View as the indicator via setIndicator(). I haven't tried it, but it may give you greater control over the layout of an individual tab's indicator.
i see...
when u addTab, usually we use setIndicator like this:
QTabHost.addTab(QTabHost.newTabSpec("tab_test2").setIndicator("TAB 2").bla bla....
u can use TextView to replace "TAB 2", became like this:
tview=new TextView(this);
tview.setText("Title here");
QTabHost.addTab(QTabHost.newTabSpec("tab_test2").setIndicator(tview).bla bla....
all u need is just modify the textview.
Thanks... ^^
int iH = getTabWidget().getLayoutParams().height;
for (int i = 0; i < tabHost.getTabWidget().getChildCount(); i++) {
tabHost.getTabWidget().getChildAt(i).getLayoutParams().height = iH;
}
for (int i = 0; i < 4; i++) {
tabhost.getTabWidget().getChildAt(i).getLayoutParams().height = 50;
}
by using this we can do very easily

Categories

Resources