Reputation: 866
I am creating an application with eclipse in Android. My software was working flawlessly until I created a function that created a new intent back to MainActivity from one of my tabbed Activiy then it stopped working, giving the 'force closed application' error whenever I ran it. I have since deleted that function but the error persists,
here is my code,
package my.main;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.TabActivity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;
public class MainActivity extends TabActivity {
HttpClient client = new HttpClient();
Security security = new Security();
//file name for storing persistent data for sessions
public static final String PREFS_SESSION = "AccountsFile";
public static String storedEmailName = "userEmail";
public static String storedPasswordName = "userPassword";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*check if username has been stored*/
// if stored info exists, log the user in with login details and display main layout
if(doesPersistExist(storedEmailName, PREFS_SESSION)){
// auto login user
try
{autologin();}
catch (UnsupportedEncodingException e)
{e.printStackTrace();}
setContentView(R.layout.tabbed_main);
// Once logged in, display tabbed layouts
// Generate tabes suing function generateTags()
// Generate tabs
generateTab("Scan", R.drawable.icon_tab_scan, ScanActivity.class);
generateTab("Recent", R.drawable.icon_tab_recent, RecentActivity.class);
generateTab("Favourites", R.drawable.icon_tab_favourites, FavouritesActivity.class);
generateTab("Settings", R.drawable.icon_tab_settings, SettingsActivity.class);
}
// else, username has not been stored, prompt login
else{
setContentView(R.layout.login);
}
}
// Auto login user if credentials already exist
public void autologin() throws UnsupportedEncodingException{
//deleted contents of function to save room - this function definitely works
}
// Function that logs a user out by deleting the store user credentials
public void logout(){
//Create a sharedPreferences instance
SharedPreferences persist = getSharedPreferences(PREFS_SESSION, 0);
// Delete stored username and password
persist.edit().remove(storedPasswordName).commit();
persist.edit().remove(storedEmailName).commit();
// Rteurn user to login screen
setContentView(R.layout.login);
}
/*storeString*/
//Persistently store a string - used for cookie name and value strings
public Boolean storeString(String PREF_NAME, String stringName, String stringValue){
// We need an Editor object to make preference changes.
// All objects are from android.context.Context
SharedPreferences settings = getSharedPreferences(PREF_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
//commit session name and value to memory
editor.putString(stringName, stringValue);
// Commit the edits
Boolean result = editor.commit();
return result;
}
/*retrieveStoredString*/
//retrieve a persistently stored string from function storeString()
public String retrieveStoredString(String PREF_NAME, String stringName){
SharedPreferences persist = getSharedPreferences(PREF_NAME, 0);
String result = persist.getString(stringName, null);
return result;
}
// Check if persistent store exists
public Boolean doesPersistExist(String key, String PREF_NAME){
SharedPreferences persist = getSharedPreferences(PREF_NAME, 0);
Boolean result = persist.contains(key);
return result;
}
// Function will generate a new tab
public void generateTab(String tabSpec, int id, Class activity){
TabHost tabHost = getTabHost();
// Tab for scan
TabSpec scanspec = tabHost.newTabSpec(tabSpec);
// setting Title and Icon for the Tab
scanspec.setIndicator(tabSpec, getResources().getDrawable(id));
// create intent to start new tabbed activity
Intent scanIntent = new Intent(this, activity);
scanspec.setContent(scanIntent);
// add the tab to the tab layout
tabHost.addTab(scanspec);
}
}
This is my tabbed_main.xml
<?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">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<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>
</TabHost>
I have created the in Manifest, as I said, the tabbed layout worked perfectly until I tried to add that function and since then nothing has worked. This is the logs from logcat,
08-08 22:11:42.390: D/dalvikvm(1966): GC_FOR_ALLOC freed 37K, 5% free 6387K/6659K, paused 32ms
08-08 22:11:42.390: I/dalvikvm-heap(1966): Grow heap (frag case) to 6.834MB for 513744-byte allocation
08-08 22:11:42.440: D/dalvikvm(1966): GC_FOR_ALLOC freed 8K, 5% free 6881K/7175K, paused 35ms
08-08 22:11:42.490: D/AndroidRuntime(1966): Shutting down VM
08-08 22:11:42.490: W/dalvikvm(1966): threadid=1: thread exiting with uncaught exception (group=0x40226760)
08-08 22:11:42.490: E/AndroidRuntime(1966): FATAL EXCEPTION: main
08-08 22:11:42.490: E/AndroidRuntime(1966): java.lang.RuntimeException: Unable to start activity ComponentInfo{my.main/my.main.MainActivity}: java.lang.RuntimeException: Your content must have a TabHost whose id attribute is 'android.R.id.tabhost'
08-08 22:11:42.490: E/AndroidRuntime(1966): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1751)
08-08 22:11:42.490: E/AndroidRuntime(1966): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1767)
08-08 22:11:42.490: E/AndroidRuntime(1966): at android.app.ActivityThread.access$1500(ActivityThread.java:122)
08-08 22:11:42.490: E/AndroidRuntime(1966): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1005)
08-08 22:11:42.490: E/AndroidRuntime(1966): at android.os.Handler.dispatchMessage(Handler.java:99)
08-08 22:11:42.490: E/AndroidRuntime(1966): at android.os.Looper.loop(Looper.java:132)
08-08 22:11:42.490: E/AndroidRuntime(1966): at android.app.ActivityThread.main(ActivityThread.java:4028)
08-08 22:11:42.490: E/AndroidRuntime(1966): at java.lang.reflect.Method.invokeNative(Native Method)
08-08 22:11:42.490: E/AndroidRuntime(1966): at java.lang.reflect.Method.invoke(Method.java:491)
08-08 22:11:42.490: E/AndroidRuntime(1966): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
08-08 22:11:42.490: E/AndroidRuntime(1966): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
08-08 22:11:42.490: E/AndroidRuntime(1966): at dalvik.system.NativeStart.main(Native Method)
08-08 22:11:42.490: E/AndroidRuntime(1966): Caused by: java.lang.RuntimeException: Your content must have a TabHost whose id attribute is 'android.R.id.tabhost'
08-08 22:11:42.490: E/AndroidRuntime(1966): at android.app.TabActivity.onContentChanged(TabActivity.java:105)
08-08 22:11:42.490: E/AndroidRuntime(1966): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:245)
08-08 22:11:42.490: E/AndroidRuntime(1966): at android.app.Activity.setContentView(Activity.java:1780)
08-08 22:11:42.490: E/AndroidRuntime(1966): at my.main.MainActivity.onCreate(MainActivity.java:57)
08-08 22:11:42.490: E/AndroidRuntime(1966): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
08-08 22:11:42.490: E/AndroidRuntime(1966): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1715)
08-08 22:11:42.490: E/AndroidRuntime(1966): ... 11 more
08-08 22:11:42.500: D/dalvikvm(1966): GC_CONCURRENT freed 61K, 4% free 7021K/7239K, paused 2ms+4ms
08-08 22:16:46.110: I/Process(1966): Sending signal. PID: 1966 SIG: 9
08-08 22:20:10.500: V/TLINE(2142): new: android.text.TextLine@40871fb0
08-08 22:20:10.530: V/TLINE(2142): new: android.text.TextLine@40872bf8
08-08 22:22:19.030: I/jdwp(2142): Ignoring second debugger -- accepting and dropping
08-08 22:22:21.210: I/jdwp(2205): Ignoring second debugger -- accepting and dropping
08-08 22:22:21.310: D/dalvikvm(2205): GC_FOR_ALLOC freed 39K, 5% free 6385K/6659K, paused 34ms
08-08 22:22:21.310: I/dalvikvm-heap(2205): Grow heap (frag case) to 6.833MB for 513744-byte allocation
08-08 22:22:21.370: D/dalvikvm(2205): GC_CONCURRENT freed 0K, 5% free 6887K/7175K, paused 3ms+2ms
08-08 22:22:21.400: D/AndroidRuntime(2205): Shutting down VM
08-08 22:22:21.400: W/dalvikvm(2205): threadid=1: thread exiting with uncaught exception (group=0x40226760)
08-08 22:22:21.410: E/AndroidRuntime(2205): FATAL EXCEPTION: main
08-08 22:22:21.410: E/AndroidRuntime(2205): java.lang.RuntimeException: Unable to start activity ComponentInfo{my.main/my.main.MainActivity}: java.lang.RuntimeException: Your content must have a TabHost whose id attribute is 'android.R.id.tabhost'
08-08 22:22:21.410: E/AndroidRuntime(2205): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1751)
08-08 22:22:21.410: E/AndroidRuntime(2205): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1767)
08-08 22:22:21.410: E/AndroidRuntime(2205): at android.app.ActivityThread.access$1500(ActivityThread.java:122)
08-08 22:22:21.410: E/AndroidRuntime(2205): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1005)
08-08 22:22:21.410: E/AndroidRuntime(2205): at android.os.Handler.dispatchMessage(Handler.java:99)
08-08 22:22:21.410: E/AndroidRuntime(2205): at android.os.Looper.loop(Looper.java:132)
08-08 22:22:21.410: E/AndroidRuntime(2205): at android.app.ActivityThread.main(ActivityThread.java:4028)
08-08 22:22:21.410: E/AndroidRuntime(2205): at java.lang.reflect.Method.invokeNative(Native Method)
08-08 22:22:21.410: E/AndroidRuntime(2205): at java.lang.reflect.Method.invoke(Method.java:491)
08-08 22:22:21.410: E/AndroidRuntime(2205): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
08-08 22:22:21.410: E/AndroidRuntime(2205): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
08-08 22:22:21.410: E/AndroidRuntime(2205): at dalvik.system.NativeStart.main(Native Method)
08-08 22:22:21.410: E/AndroidRuntime(2205): Caused by: java.lang.RuntimeException: Your content must have a TabHost whose id attribute is 'android.R.id.tabhost'
08-08 22:22:21.410: E/AndroidRuntime(2205): at android.app.TabActivity.onContentChanged(TabActivity.java:105)
08-08 22:22:21.410: E/AndroidRuntime(2205): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:245)
08-08 22:22:21.410: E/AndroidRuntime(2205): at android.app.Activity.setContentView(Activity.java:1780)
08-08 22:22:21.410: E/AndroidRuntime(2205): at my.main.MainActivity.onCreate(MainActivity.java:57)
08-08 22:22:21.410: E/AndroidRuntime(2205): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
08-08 22:22:21.410: E/AndroidRuntime(2205): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1715)
08-08 22:22:21.410: E/AndroidRuntime(2205): ... 11 more
08-08 22:27:25.039: I/Process(2205): Sending signal. PID: 2205 SIG: 9
It looks like "Your content must have a TabHost whose id attribute is 'android.R.id.tabhost' error with" is the major error here, but from looking online I have found that this is usually down to not setting the id tag in the 'tabbed_main.xml' properly but I have definitely set that right. I have spent hours looking online and through code but am clueless to why it doesn't work. Any help would be greatly appreciated! Thanks.
Upvotes: 1
Views: 6682
Reputation: 866
Right, so I managed to find out what the problem is, so I thought I would share. The problem was down to using SharedPreferences functions within TabActivity. When I changed the extend to Activity and created a new MainTabbedActivity to generate the tabs for the tab layout everything worked fine.
I'm not 100% sure why this is but I guess it might have something to do with Context. I was most probably using TabActivity wrong as all that activity is supposed to do is generate tabs for the tablayout - not execute any functions. (if anyone knows the exact reason it doesn't work please feel free to comment, I would love to know!)
So for anyone with similar problems in the future, just do whatever you need to do in your main activity, then create an intent to your TabActivity like so,
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*check if username has been stored*/
// if stored info exists, log the user in with login details and display main layout
if(doesPersistExist(storedEmailName, PREFS_SESSION)){
// auto login user
// Once logged in, display tabbed layouts
Intent i = new Intent(getApplicationContext(), MainTabbedActivity.class);
startActivity(i);
}
// else, username has not been stored, prompt login
else{
setContentView(R.layout.login);
}
}
Upvotes: 3
Reputation: 30
Rename your xml file to something unique like main.xml or something else instead of tabbed_main.xml. Also clean your project and delete R file (it will be regenerated again) , sometimes it solves your problem.
Upvotes: -1
Reputation: 8708
Well,
I'm really not sure, but according to this answer, once he replaced
android:id="@android:id/tabhost"
with
android:id="@+id/tabhost"
It worked for him.. give it a try.
EDIT
Since that didn't work, the answer below that one, indicated that he got this working by deleteing the R.java
file, and once the IDE regenerated it (maybe by rebuilding) it worked
Good luck
Upvotes: 0