2012-08-08 29 views
1

我創造與Eclipse在Android的應用程序。我的軟件完美無缺地工作,直到我創建了一個函數,該函數從我的選項卡中的一個Activiy創建了一個新的意圖返回到MainActivity,然後它停止工作,每當我運行它時都會給出'強制關閉應用程序'錯誤。因爲我已經刪除的功能,但問題仍然存在,您的內容必須有一個TabHost其id屬性爲「android.R.id.tabhost」錯誤與Android應用

這裏是我的代碼,

包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); 

    } 




} 

這是我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> 

我已經創造了在清單,正如我所說的,標籤式佈局完美地工作,直到我試圖添加功能,從那時起沒有奏效。這是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: [email protected] 
08-08 22:20:10.530: V/TLINE(2142): new: [email protected] 
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 

它看起來像「你的內容必須有一個TabHost其id屬性爲‘android.R.id.tabhost’錯誤」是主要的錯誤在這裏,但在網上搜索我發現這通常只是爲了不在'tabbed_main.xml'中正確設置id標記,但我已經明確地設置了這一點。我花了數小時在網上和通過代碼查找,但對於爲什麼它不起作用卻一無所知。任何幫助將不勝感激!謝謝。

回答

3

對,所以我設法找出問題是什麼,所以我想我也有同感。問題是到使用SharedPreferences TabActivity功能。當我改變了延伸至活動並創建了一個新的MainTabbedActivity產生的標籤佈局的一切標籤工作得很好。

我不是100%肯定這是爲什麼,但我想這可能是與上下文。我很可能使用TabActivity錯誤,因爲所有該活動應該做的是爲tablayout生成選項卡 ​​- 不執行任何功能。 (如果有人知道它不起作用的確切原因,請隨時發表評論,我很想知道!)

因此,對於在今後發生類似問題的人,只是做任何你需要在你的主要活動做的,然後創建一個意圖,你TabActivity像這樣,

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); 
      } 

} 
0

好,

我真的不知道,但根據this答案,一旦他接替

android:id="@android:id/tabhost" 

android:id="@+id/tabhost" 

這爲他工作..給它一個嘗試。

編輯 由於沒有工作,下面是一個答案,表示,他delete一個由該R.java文件得到了這個工作,一旦IDE再生它(也許重建),它的工作 好運

-1

重命名你的XML文件來唯一喜歡的main.xml或別的東西,而不是tabbed_main.xml東西。同時清理你的項目並刪除R文件(它會重新生成),有時它可以解決你的問題。

+0

刪除R.java,仍然獲得錯誤。 – rusty009 2012-08-08 21:54:52

相關問題