2013-04-24 20 views
19

मेरे पास एक व्यूपेजर है जिसमें एक ही खंड के कई उदाहरण हैं, इस खंड में एक लेख है। अनुच्छेद दृश्य पदानुक्रम काफी सरल है, एक शीर्षक, एक बैनर छवि, एक उपशीर्षक और एक शरीर; शीर्षक के अलावा सब कुछ एक स्क्रॉलव्यू में लपेटा गया है।ViewPager के अंदर स्क्रॉलव्यू, स्वचालित रूप से मध्य तक स्क्रॉल

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

मैंने प्रश्न के निचले हिस्से में लेआउट पोस्ट किया है।

class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 

    Bundle args; 
    int count; 

    public ScreenSlidePagerAdapter(FragmentManager fm) { 
     super(fm); 
     this.count = 8; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     ArticleFragment mPrimaryFragment = new ArticleFragment(); 
     args = new Bundle(); 
     args.putString(ArticleFragment.KEY_ARTICLE_URL, mCurArticleLink); 
     mPrimaryFragment.setArguments(args); 
     return mPrimaryFragment;    
    } 

    @Override 
    public int getCount() { 
     return count; 
    } 
} 

टुकड़ा खुद भी बहुत सरल है:

अब, ViewPager एक FragmentStatePagerAdapter का एक सरल कार्यान्वयन के साथ सेट कर दिया जाता है, यहाँ कोड है। सबसे पहले, मैं onCreate दौरान जाँच अगर हम लेख कैश्ड, पर onCreateView

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.apk_article_view, null); 

    mTitle = (TextView) view.findViewById(R.id.article_title); 
    mBanner = (ImageView) view.findViewById(R.id.article_banner); 
    mSubTitle = (TextView) view.findViewById(R.id.article_subtitle); 
    mContent = (TextView) view.findViewById(R.id.article_content); 

    if (isArticleCached) { 
     Constants.logMessage("Article is cached, loading from database"); 
     setApkArticleContent(); 
    } 
    else { 
     Constants.logMessage("Article isn't cached, downloading"); 
     HtmlHelper.setApkArticleContent(mContext, mUrl, mTitle, mSubTitle, mContent, mBanner); 
     setRefreshing(true); 
    } 

    return view; 
} 

यह ध्यान देने योग्य है कि setApkArticleContent ग्रंथों का एक सरल सेट है लायक है मैं कॉल, फैंसी कुछ भी नहीं है देखने के लिए:

private void setApkArticleContent() { 
    mTitle.setText(Html.fromHtml(mCursor.getString(mCursor.getColumnIndex(DbOpenHelper.TITLE)))); 
    mSubTitle.setText(Html.fromHtml(mCursor.getString(mCursor.getColumnIndex(DbOpenHelper.SUBTITLE)))); 
    mContent.setText(Html.fromHtml(mCursor.getString(mCursor.getColumnIndex(DbOpenHelper.BODY)))); 
    UrlImageViewHelper.setUrlDrawable(mBanner, mCursor.getString(mCursor.getColumnIndex(DbOpenHelper.BANNER)));  
} 

साथ ही, कृपया यह जान लें कि मेरे पास से पहले पेजर नहीं था, तो टुकड़ा केवल खाली गतिविधि पर लोड किया गया था, और स्क्रॉलव्यू के बीच स्क्रॉल किए बिना काम किया।

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

क्या आपके पास कोई विचार है कि यह ऐसा क्यों व्यवहार करेगा? इस बारे में कोई विचार कि मैं उस अनजाने स्क्रॉल को कैसे रोक सकता हूं?

धन्यवाद,

नीचे ArticleFragment के लिए लेआउट है:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/article_title" 
    style="@style/headerTextBoldNoUnderline" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:gravity="left|center_vertical" 
    android:text="" /> 

<ScrollView 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    > 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     > 

     <ImageView 
      android:id="@+id/article_banner" 
      android:layout_gravity="center_vertical|center_horizontal" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_margin="12dp" /> 

     <TextView 
      android:id="@+id/article_subtitle" 
      style="@style/HeaderTextItalicNoUnderline" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="left|center_vertical" /> 

     <View 
      android:layout_width="fill_parent" 
      android:layout_height="1dp" 
      android:background="?android:attr/dividerVertical" /> 

     <TextView 
      android:id="@+id/article_content" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:fontFamily="sans-serif-light" 
      android:gravity="left|center_vertical" 
      android:padding="8dp" 
      android:textColor="?android:attr/textColorSecondary" 
      android:textIsSelectable="true" 
      android:textSize="16sp" /> 
    </LinearLayout> 
</ScrollView> 

</LinearLayout> 
+0

क्या आपने ScrollView पर 'android: descendantFocusability' के साथ गड़बड़ करने का प्रयास किया है? –

+0

बस किया, मैंने वास्तव में इसके लिए सभी तीन मानों की कोशिश की, सभी तीनों के लिए एक ही परिणाम मिला, स्क्रॉलव्यू अभी भी बीच में स्क्रॉल करता है। –

+0

नोट: आपको 'एंड्रॉइड: फोकस करने योग्य = सत्य' और 'एंड्रॉइड:' एंड्रॉइड के लिए फोकस करने योग्य इंटचौडोड = सत्य' 'का उपयोग करने की आवश्यकता हो सकती है: अवरोधक फोकसबिलिटी = पहले डिस्केन्डेंट्स'। मुझे संदेह है कि मुद्दे 'एंड्रॉइड: टेक्स्ट ISelectable' को शामिल करने में आधारित हैं। नियंत्रण के रूप में इसे हटाने का भी प्रयास करें। –

उत्तर

28

यह संभावना android:textIsSelectable के कारण होता है। आप निम्न को स्क्रॉलव्यू में जोड़ने का प्रयास कर सकते हैं:

android:focusable="true" 
android:focusableInTouchMode="true" 
android:descendantFocusability="beforeDescendants" 
+2

शायद यह रैखिक लाइनरलाइट पर भी कोशिश करें, अगर यह काम नहीं करता है। –

+7

ScrollView के अंदर LinearLayout में लाइनों को जोड़कर अच्छी तरह से काम किया, एंड्रॉइड को भी हटा दिया: textIs चयन योग्य। –

+1

धन्यवाद! आपने अपना जीवन बचाया – jackcar

2

मुझे यह समस्या भी थी। मैंने इसे स्क्रॉलव्यू के लिनियरलाउट में पहले तत्व में android:focusable="true" और android:focusableInTouchMode="true" सेट करने के साथ हल किया।

8

इस सवाल के अनुसार scrollview के बच्चे को यह विशेषता मान android:descendantFocusability="blocksDescendants" जोड़ें,: How to prevent a scrollview from scrolling to a webview after data is loaded?

+2

मैं पुष्टि कर सकता हूं कि यह काम करता है! –

+0

बहुत बढ़िया धन्यवाद! –

0

मैं समाधान की कोशिश की:

android:focusable=true 

android:focusableInTouchMode=true 

android:descendantFocusability=beforeDescendants 

और मुझे नहीं पता क्यों, लेकिन मैं नहीं कर सकते मेरी RelativeLayout के साथ ऐसा कर जो मूल दृश्य है (यह काम नहीं करता है)।

मुझे अपने टेक्स्ट व्यू को फ्रेमलेआउट के अंदर लपेटना पड़ा और अब सबकुछ ठीक है। शायद यह किसी की मदद करता है।

<FrameLayout 
     android:id="@+id/detail_description_container" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/detail_parameters_container" 
     android:layout_centerInParent="true" 
     android:descendantFocusability="beforeDescendants" 
     android:focusable="true" 
     android:focusableInTouchMode="true" > 

     <TextView 
      android:id="@+id/detail_descritpion" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:autoLink="all" 
      android:padding="10dp" 
      android:textIsSelectable="true" /> 
    </FrameLayout> 
0

स्वचालित रूप से ViewPager स्क्रॉल अंदर ScrollView लेकिन करता है बीच में नहीं स्क्रॉल .. चेक इस बाहर।

pager.setOnPageChangeListener(new OnPageChangeListener() { 

       @Override 
       public void onPageSelected(int position) { 
        // TODO Auto-generated method stub 
        int x=iv.getLeft(); 
        int y=iv.getTop(); 
        scroll.scrollTo(x, y); 
       } 

pagerViewPager की वस्तु है और scrollScrollView है और iv किसी भी View कहना TextView या ImageView है।

जब हम व्यूअरजर में पृष्ठ बदलते हैं, तो स्क्रॉलबार स्वचालित रूप से स्क्रॉल करता है लेकिन बाईं ओर। आप बीच के लिए ढूंढें समाधान चाहते हैं तो कृपया मुझे बताएं .. :)

0

मैं जड़ viewGroup में

android:focusable="true" 
    android:focusableInTouchMode="true" 
    android:descendantFocusability="beforeDescendants" 

जोड़ने के लिए प्रयास करें। यह काम अच्छी तरह से है। नीचे की तरह।

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:focusable="true" 
    android:focusableInTouchMode="true" 
    android:descendantFocusability="beforeDescendants" 
    android:background="@color/normal_bg"> 

    <ScrollView 
     android:id="@+id/scroll" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_above="@+id/rl_enter" 
     android:scrollbars="none"> 
     </ScrollView> 
    </RelativeLayout> 
+0

आप स्पष्टीकरण के कुछ शब्द जोड़ना चाहते हैं। – mkl

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