2010-07-02 10 views
42

मैं टैब टैबएक्टिविटी बढ़ाने के बिना टैब बनाना चाहता हूं। (कारण यह है कि टैबएक्टिविटी एक कस्टम टाइटलबार को संभाल नहीं सकता है जैसा कि लगता है)। मेरे पास हैएंड्रॉइड: TabActivity के बिना TabHost

public class startTab extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mylayout); 
     Resources res = getResources(); 
     LocalActivityManager mlam = new LocalActivityManager(this, false); 
     TabHost tabHost = (TabHost) findViewById(R.id.tabhost); 
     tabHost.setup(mlam); 
     TabHost.TabSpec spec; 
     Intent intent; 

    intent = new Intent().setClass(this, Show1.class); 
    spec = tabHost.newTabSpec("Items").setIndicator("Items", res.getDrawable(R.drawable.items32_ldpi)).setContent(intent); 
    tabHost.addTab(spec); 

    intent = new Intent().setClass(this, Show2.class); 
    spec = tabHost.newTabSpec("Users").setIndicator("Users",res.getDrawable(R.drawable.user32_ldpi)).setContent(intent); 
    tabHost.addTab(spec); 
} 

}

त्रुटि मैं

07-02 07:11:12.715: ERROR/AndroidRuntime(411): 
Caused by: java.lang.IllegalStateException: Activities can't be added until the containing group has been created. 

देखने के लिए एक्सएमएल

<?xml version="1.0" encoding="utf-8"?> 
<TabHost xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/tabhost" android:orientation="vertical" android:layout_width="fill_parent" 
android:layout_height="fill_parent" > 
<LinearLayout android:orientation="vertical" 
    android:layout_width="fill_parent" android:layout_height="fill_parent" 
    android:paddingTop="5dip"> 
    <TabWidget android:id="@android:id/tabs" 
    android:layout_width="fill_parent" android:layout_height="fill_parent"></TabWidget> 
    <FrameLayout android:id="@android:id/tabcontent" 
    android:layout_width="fill_parent" android:layout_height="fill_parent" 
    android:paddingTop="5dip"> 
    </FrameLayout> 
</LinearLayout> 
</TabHost> 

मैंने कहीं पढ़ा है कि मैं एक LocalActivityManager उपयोग करने के लिए है कि है, मुझे लगता है कि मुझे वहां कुछ याद आ रहा है। किसी को भी एक विचार?

धन्यवाद!

+0

इस ट्यूटोरियल आप मदद कर सकता है http://learnncode.wordpress.com की जरूरत/2013/12/18/कैसे-उपयोग-टैबविड्ज-साथ-टुकड़े/ – Prachi

उत्तर

13

कृपया अपने टैब की सामग्री के रूप में Views का उपयोग करने पर विचार करें। न केवल इसके परिणामस्वरूप कम कोड, कम खपत वाले हीप स्पेस, कम खपत वाली स्टैक स्पेस, और कम CPU उपयोग, यह आपको इस समस्या से भी दूर कर देगा। इस तकनीक को दिखाते हुए twoexamples यहां दिए गए हैं।

+1

धन्यवाद। लेकिन अगर मैं इरादों से काम नहीं करता हूं तो मेरे पास प्रत्येक टैब के लिए एक अलग मेनू कैसे हो सकता है? – paradroid666

+0

@paradroid: वर्तमान में सक्रिय टैब के आधार पर एक अलग मेनू लोड करें। – CommonsWare

+0

यह एक गतिविधि का उपयोग करने में पूरा बिंदु है - यह एक बेहतर कार्यात्मक अलगाव है। –

1

डिजाइन विचारों के बावजूद, निम्नलिखित काम नहीं करते हैं, और एपीआई इंगित करता है कि setContent(Intent i) मान्य है। यह काम करता है जब गतिविधि TabActivity फैली हुई है, तथापि, Activity का विस्तार और एक exception at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:649)

अजीब बात है, LogCat पता चलता है मैं tabHost.setup कॉल करने से पहले setup()

mTabHost = (TabHost) findViewById(android.R.id.tabhost); 
mTabHost.setup(); 

Intent tab1Intent = new Intent(this, ActivityOne.class); 
Button tab1View = new Button(this); 
tab1View.setText("Activity 1"); 
    mTabHost.addTab(mTabHost.newTabSpec("tab_1").setIndicator(tab1View).setContent(tab1Intent)); 
+0

क्या यह काम करता है या नहीं? –

+0

मेरे लिए काम नहीं किया। –

+0

ऐसा लगता है कि यह एक अलग सवाल होना चाहिए था। जिस मुद्दे पर आप चल रहे हैं वह यह है कि आप टैब्डएक्टिविटी का उपयोग नहीं कर रहे हैं, जिसका अर्थ है कि आपको ऊपर दिए गए अनुसार गतिविधि प्रबंधक के साथ सेट अप करने की आवश्यकता है। इससे आपको इस मुद्दे पर ले जाया जाएगा, जब तक कि आप ईवेंट मैनेजर को ईवेंट को सही तरीके से प्रेषित न करें। – shortstuffsushi

86

कॉल करने के लिए भूल गया में जोड़ने setup() कॉल परिणाम (mLocalActivityManager); आपको यह लाइन जोड़नी होगी।

mlam.dispatchCreate(savedInstanceState); 
tabHost.setup(mlam); 

इसी तरह, आप, onResume के लिए जोड़ने के लिए

mlam.dispatchResume(); 

onPause(),

mlam.dispatchPause(isFinishing()); 
+1

यह काम करता है! किसी को इस समाधान को स्वीकार करना चाहिए! – shihpeng

+4

लेकिन क्या आप कृपया यह बता सकते हैं कि यह dispatchXXX() विधियों को जोड़ने के बाद यह क्यों काम करता है? बहुत बहुत धन्यवाद :) – shihpeng

+0

महान मेरे लिए काम किया! –

4
public class ScoreboardActivity extends Activity { 
    LocalActivityManager mlam; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_scoreboard); 
     mlam = new LocalActivityManager(this, false); 
     mlam.dispatchCreate(savedInstanceState); 
     TabHost th = (TabHost) findViewById(android.R.id.tabhost); 
     th.setup(mlam); 
     th.addTab(th.newTabSpec("Numpad").setIndicator("Numpad").setContent(R.id.tab1)); 
     th.addTab(th.newTabSpec("CardCount").setIndicator("CardCount").setContent(R.id.tab2)); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_scoreboard, menu); 
     return true; 


    } 
    @Override 
    protected void onResume(){ 
     super.onResume(); 
     mlam.dispatchResume(); 
    } 

    @Override 
    protected void onPause(){ 
     super.onPause(); 
     mlam.dispatchPause(isFinishing()); 
    } 

} 
+1

'LocalActivityManager' अब बहिष्कृत है –

संबंधित मुद्दे