2010-08-16 17 views
5

मेरा नियोक्ता मुझे बहुत विशिष्ट यूआई आवश्यकताओं के साथ एंड्रॉइड एप्लिकेशन पर काम कर रहा है। विशेष रूप से, हमें एक इंटरफ़ेस की आवश्यकता होती है जो बिल्कुल TabWidget इंटरफ़ेस की तरह दिखती है। हालांकि, बाईं ओर वाले टैब होने पर एक पूर्ण जरूरी है। हम किसी भी एंड्रॉइड फोन पर किसी भी एंड्रॉइड फोन पर इस एप्लिकेशन को तैनात नहीं करेंगे, और इस तरह एंड्रॉइड प्लेटफ़ॉर्म के किसी भी डिज़ाइन विचारों का उल्लंघन करने में कोई समस्या नहीं है।एंड्रॉइड टैबविड्ज के लिए मौजूदा पैच बाएं हाथ की तरफ टैब की अनुमति देने के लिए?

हमारे पास पहले से ही एक कामकाजी प्रोटोटाइप है जो फोकस श्रोताओं और सूची दृश्यों के संयोजन का उपयोग करके हमें आवश्यक कार्यक्षमता को एक साथ जोड़ता है। यह सुंदर नहीं है, और हम अभी तक इसमें बहुत भरोसेमंद नहीं हैं, लेकिन यह समय के लिए काम करता है।

हम वास्तव में क्या चाहते हैं कि हमारे सभी प्रोटोटाइप यूआई कोड को टैबविड्ज में निर्मित करने के बदले में फेंक दें। हालांकि, चूंकि टैबविड्ज को केवल शीर्ष पर टैब के साथ काम करने के लिए हार्डकोड किया गया है, यह वास्तव में एक विकल्प नहीं है।

तो, हम उम्मीद कर रहे हैं किसी को वहाँ बाहर एक पैच, या पैच का सेट, या शायद एक कस्टम वर्ग, कि बजाय तरफ टैब के साथ TabWidget कार्यक्षमता संभालती है?

TabWidget के लिए प्रासंगिक कोड यहाँ है: http://www.google.com/codesearch/p?hl=en#uX1GffpyOZk/core/java/android/widget/TabWidget.java&q=android%20package:git://android.git.kernel.org%20lang:java%20tabwidget&sa=N&cd=1&ct=rc

और विशेष समारोह है कि शीर्ष पर नजर होने के लिए hardcoded है

private void initTabWidget() { 
    setOrientation(LinearLayout.HORIZONTAL); 
    mGroupFlags |= FLAG_USE_CHILD_DRAWING_ORDER; 

    final Context context = mContext; 
    final Resources resources = context.getResources(); 

    if (context.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.DONUT) { 
     // Donut apps get old color scheme 
     if (mLeftStrip == null) { 
      mLeftStrip = resources.getDrawable(
        com.android.internal.R.drawable.tab_bottom_left_v4); 
     } 
     if (mRightStrip == null) { 
      mRightStrip = resources.getDrawable(
        com.android.internal.R.drawable.tab_bottom_right_v4); 
     } 
    } else { 
     // Use modern color scheme for Eclair and beyond 
     if (mLeftStrip == null) { 
      mLeftStrip = resources.getDrawable(
        com.android.internal.R.drawable.tab_bottom_left); 
     } 
     if (mRightStrip == null) { 
      mRightStrip = resources.getDrawable(
        com.android.internal.R.drawable.tab_bottom_right); 
     } 
    } 

    // Deal with focus, as we don't want the focus to go by default 
    // to a tab other than the current tab 
    setFocusable(true); 
    setOnFocusChangeListener(this); 
} 

है किसी को भी किसी भी जानकारी है, तो मैं बहुत आभारी होगा ।

उत्तर

1

मुझे इस समस्या को नीचे टैब के साथ मिला है। मैं बस सभी टैब पृष्ठभूमि ड्रॉबल्स की प्रतिलिपि बना रहा हूं और राज्यों के ड्रॉबल्स और टेक्स्टकलर के साथ बटन बना रहा हूं जो दृश्यों के बीच स्विच करने के लिए मुख्य यूआई फलक में व्यूफ्लिपर को नियंत्रित करने वाले टैब की तरह दिखते थे।

+0

यह एक वास्तविक शर्म की बात है कि TabActivty टैब पर नीचे या तरफ से टैब को संभाल नहीं सकता है। मुझे नहीं लगता कि यह क्यों नहीं बनाया गया है। मैंने एंड्रॉइड बग ट्रैकर पर एक बग रिपोर्ट स्थापित की है, लेकिन वास्तव में कोई संकेत नहीं है कि यह जल्द ही किसी भी समय काम करेगा। http://code.google.com/p/android/issues/detail?id=3862&can=1&q=TabWidget&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars#makechanges –

1

(ध्यान दें कि मैं एक बेहतर जवाब और नीचे जोड़ा, लाइन अतीत। मैं इस मामले में इस शीर्ष एक जा रहा हूँ वह अच्छी तरह फिट किसी और की जरूरत है।)

हाँ, मैं के साथ काम कर रहा है वही मुद्दा। मेरे पास कुछ हद तक घबराहट समाधान है। मैंने देखा है कि आप setRotate के साथ किसी भी दृश्य को घुमा सकते हैं। दुर्भाग्यवश, यह केवल अपनी छवि या कुछ घुमाता है, और मुद्दों या प्लेसमेंट या आकार या संरेखण से पूरी तरह से निपटता नहीं है। फिर भी, मैंने कुछ ऐसी चीज को इकट्ठा करने में कामयाब रहा है जो कि इसके लिए क्षतिपूर्ति करता है, हालांकि यह केवल आधा किया जाता है (यदि आप पोर्ट्रेट अभिविन्यास पर घूमते हैं तो सही काम नहीं करता है)। जब भी टैबलेट घुमाया जाता है या लेआउट को फिर से व्यवस्थित किया जाता है या जो कुछ भी हो जाता है, तो निम्नलिखित को बुलाया जाता है।

private LinearLayout llMain; 
private LinearLayout ll1; 
private LinearLayout mainView; 
private TabHost myTabHost; 

public void setStuff() { 
    Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 
    if (display.getOrientation() == 0 || display.getOrientation() == 2) { 
     ViewGroup.LayoutParams lp = myTabHost.getLayoutParams(); 
     int top = 0; 
     int left = 0; 
     int height = 696; 
     int width = 1280; 
     int centerx = (width/2) + left; 
     int centery = (height/2) + top; 
     lp.height = width; 
     lp.width = height; 
     myTabHost.setLayoutParams(lp); 
     myTabHost.setTranslationX(centerx - (height/2)); 
     myTabHost.setTranslationY(centery - (width/2)); 
     lp = mainView.getLayoutParams(); 
     lp.width = 1280; 
     lp.height = 696; 
     mainView.setLayoutParams(lp); 
     lp = llMain.getLayoutParams(); 
     lp.width = 1280; 
     lp.height = 696; 
     llMain.setLayoutParams(lp); 

     ll1.setRotation(-90); 
     lp = ll1.getLayoutParams(); 
     lp.height = 696; 
     lp.width = 1141; 
     ll1.setLayoutParams(lp); 
     left = 0; 
     top = 0; 
     height = 696; 
     width = 1141; 
     centerx = (width/2) + left; 
     centery = (height/2) + top; 
     ll1.setTranslationX(centery - (width/2)); 
     ll1.setTranslationY(centerx - (height/2)); 
     //ll1.setTranslationX(tx); 
     //ll1.setTranslationY(ty); 
    } else { 
     ViewGroup.LayoutParams lp = myTabHost.getLayoutParams(); 
     int top = 0; 
     int left = 0; 
     int height = 1280; 
     int width = 696; 
     int centerx = (width/2) + left; 
     int centery = (height/2) + top; 
     lp.height = width; 
     lp.width = height; 
     myTabHost.setLayoutParams(lp); 
     myTabHost.setTranslationX(centerx - (height/2)); 
     myTabHost.setTranslationY(centery - (width/2)); 
     lp = mainView.getLayoutParams(); 
     lp.width = 696; 
     lp.height = 1280; 
     mainView.setLayoutParams(lp); 
     lp = llMain.getLayoutParams(); 
     lp.width = 696; 
     lp.height = 1280; 
     llMain.setLayoutParams(lp); 

     ll1.setRotation(-90); 
     lp = ll1.getLayoutParams(); 
     lp.height = 1141; 
     lp.width = 696; 
     ll1.setLayoutParams(lp); 
     left = 0; 
     top = 0; 
     height = 1141; 
     width = 696; 
     centerx = (width/2) + left; 
     centery = (height/2) + top; 
     ll1.setTranslationX(centery - (width/1)); 
     ll1.setTranslationY(centerx - (height/1)); 
     //ll1.setTranslationX(tx); 
     //ll1.setTranslationY(ty); 
    } 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    setStuff(); 
    //setContentView(R.layout.main); 
} 

llMain में मुख्य दृश्य में MyTabHost में ll1 शामिल है; आपको प्रारंभिक कोड में उन्हें असाइन करने की आवश्यकता होगी। विचार यह है कि टैबहोस्ट घड़ी की दिशा में घूमता है, और इसके आयामों को मैन्युअल रूप से बदलना पड़ता है ताकि उसके कंटेनर जानते हों कि यह एक अलग आकार/आकार है, अन्यथा किनारों को काट दिया जाता है। साथ ही, कुछ गणनाएं की जाती हैं ताकि यह सही बिंदु के चारों ओर घुमाया जा सके, या कम से कम सही जगह पर समाप्त हो जाए। नतीजे हमेशा समझ में नहीं आते थे, इसलिए मैंने कम से कम लैंडस्केप मोड में काम करने तक सामान बदल दिया। TabHost की सामग्री भी घूमती है, इसलिए वहां कोड है जो इसे वापस घुमाता है, कम से कम पहला टैब, जो ll1 है। अन्य टैब को समान रूप से पीछे घुमाने की आवश्यकता होगी। मैं थोड़ी देर के लिए इसके साथ गड़बड़ कर रहा था, और कुछ चीजें हो सकती हैं जो अनावश्यक हैं। उदाहरण के लिए, मुख्य दृश्य। मुझे लगता है कि वहां रहने की जरूरत नहीं है। ओह, और यदि टैबहोस्ट एक अलग जगह पर है, तो संख्याओं को किसी भी तरह समायोजित करने की आवश्यकता होगी। उसके साथ अच्छा भाग्य। वैसे भी, मुझे उम्मीद है कि यह किसी की मदद करेगा। मैन, एंड्रॉइड जीयूआई इतना बढ़ रहा है ... मेरी इच्छा है कि वे इसे ठीक कर दें ....हालांकि, मैं स्वीकार करूंगा कि सभी बाधाओं और निराशाओं के बावजूद, किसी भी घटक का घूर्णन बहुत अच्छा है। मैं बस बाकी सब कुछ कामना करता हूं जैसा आप उम्मीद करेंगे।


अरे, मैंने अभी यह पता लगाया है कि इसे ठीक से कैसे किया जाए! लेबल क्षैतिज रहने के लिए, ताकि या एक अच्छी बात नहीं हो सकता हैं और आप क्या चाहते हैं पर निर्भर करता है, लेकिन वैसे भी:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <TabHost android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="match_parent"> 
     <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> 
      <FrameLayout android:layout_width="fill_parent" android:layout_height="match_parent" android:layout_weight="1" android:id="@android:id/tabcontent"></FrameLayout> 
      <ScrollView android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:fillViewport="true" 
       android:scrollbars="none">   
       <TabWidget android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:id="@android:id/tabs"></TabWidget> 
      </ScrollView> 
     </LinearLayout> 
    </TabHost> 

</LinearLayout> 

इस एक्सएमएल फ़ाइल सही पर नजर के साथ एक खाली tabhost परिभाषित करता है। बस अपने कोड में टैब जोड़ें; उसके लिए चारों ओर पोस्ट हैं। अपनी ज़रूरतों को पूरा करने के लिए आपको जो भी करने की ज़रूरत है उसे कॉपी/बदलें/करें। साथ ही, क्योंकि यह अच्छा है, मैंने टैबविड्ज के चारों ओर एक स्क्रॉल व्यू जोड़ा, इसलिए यदि आपके पास बहुत सारे टैब हैं तो यह स्वचालित रूप से स्क्रॉलिंग की अनुमति देगा। अगर आप इसे नहीं चाहते हैं तो इससे छुटकारा पाएं। स्क्रॉल चीज को ज्यादातर http://java.dzone.com/articles/scrolling-tabs-android से मिला। वाह!

+0

इस लगता है कि यह काम करना चाहिए, लेकिन मुझे अजीब परिणाम मिलते हैं। मैंने आपके एक्सएमएल की प्रतिलिपि बनाई और चिपकाया। मेरे लिए, यह टैब को दाईं ओर रखता है, लेकिन टैब अभी भी क्षैतिज रूप से व्यवस्थित होते हैं, और इसके नीचे एक टैब खाली सामग्री के साथ, उनके नीचे एक बड़ी खाली जगह होती है। यह बहुत बदसूरत है, और मैं कल्पना नहीं कर सकता कि आप क्या चाहते हैं? –

+0

ठीक है, मूल रूप से नहीं, लेकिन यह मेरे उद्देश्यों के लिए अच्छी तरह से काम कर रहा है। शायद ऐसा इसलिए है क्योंकि मेरे पास एक टैबलेट है, इसलिए टैब के क्षैतिज होने के लिए बहुत सी जगह है। इसके अलावा, मुझे अंतरिक्ष में उचित संख्या में टैब फिट करने की आवश्यकता है, इसलिए यह मेरे लिए बेहतर काम करता है, वैसे भी। क्षमा करें कि यह काफी नहीं है जिसे आप ढूंढ रहे थे। आप अभी भी ऑब्जेक्ट रोटेशन के साथ गड़बड़ करने का प्रयास कर सकते हैं, शायद इसके साथ संयोजन में, किसी भी तरह। सौभाग्य! – Erhannis

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

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