2012-06-06 8 views
12

Ich baue eine Android-Anwendung mit dem folgenden Layout. application layoutViewPager nicht unterstützt layout_height = wrap_content

Es ist bereits bekannt, dass layout_height="wrap_content" nicht für den ViewPager funktioniert.

Meine Frage ist, wie man es dynamisch ändert. Der Inhalt des ViewPager ist aus zwei XML-Layouts aufgeblasen, vp_statistics.xml and vp_campaigns.xml.

hier ist der xml für die ViewPager

<LinearLayout 
      android:id="@+id/topcontent_wrapper" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="10dp" 
      android:orientation="vertical" > 
</LinearLayout> 

<LinearLayout 
      android:id="@+id/viewpager_wrapper" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="10dp" 
      android:orientation="vertical" > 

      <android.support.v4.view.ViewPager 
       android:id="@+id/viewpager" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" /> 
</LinearLayout> 

der Code Hier ist für meine PagerAdapter

class MyPagerAdapter extends PagerAdapter{ 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return 2; 
} 

public Object instantiateItem(View collection, int pos){ 
    LayoutInflater inflater =  (LayoutInflater)collection.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    int resId = 0; 
    switch(pos){ 
    case 0: 
     resId = R.layout.vp_statistics; 
     break; 
    case 1: 
     resId = R.layout.vp_campaigns; 
     break; 
    } 

    View view = inflater.inflate(resId, null); 


    ((ViewPager)collection).addView(view, 0); 

    return view; 
} 

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    // TODO Auto-generated method stub 
    ((ViewPager)container).removeView((View)object); 
} 

@Override 
public boolean isViewFromObject(View arg0, Object arg1) { 
    // TODO Auto-generated method stub 
    return arg0 == ((View)arg1); 
} 

@Override 
public Parcelable saveState() { 
    // TODO Auto-generated method stub 
    return null; 
} 

} 

und in meinem onCreate() mthod der Aktivitätsklasse:

MyPagerAdapter adapter = new MyPagerAdapter(); 
ViewPager viewPager = (ViewPager)findViewById(R.id.viewpager); 
viewPager.setAdapter(adapter); 
viewPager.setCurrentItem(0); 

Gibt es einen Weg, um die Höhe der vp_statistics.xml und vp_campaigns.xml Layouts und zuweisen Sie es dynamisch zu ViewPager (@id/viewpager) jedes Mal, wenn das instantiateItem() Objekt aufgerufen wird?

+0

haben Sie das Problem behoben? Ich habe eine ähnliche. – Matroska

+0

haben Sie die Lösung für diese – koti

+0

finden Sie bitte Stern Problem https://code.google.com/p/android/issues/detail?id=54604 – Christ

Antwort

0

Verwendung 0dp statt wrap_content und für sie dynamisch ändern, dass

pager = new ViewPager(this); 
     pager.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 
+8

Ihr Code funktioniert nicht, es stürzt tatsächlich die Anwendung. Der richtige Code wäre 'pager.setLayoutParams (neu LinearLayout.LayoutParams (LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));' Aber auch mit dem geänderten Code, ist es nicht die Höhe des ViewPager ändern. –

-1

Um verschiedene Bildschirm Immobilien zu jedem linearen Layout zuweisen versuchen, die layout_weight Parameter. Sie können diesen In-Code neu zuordnen, um diese "dynamische" Gewichtungsänderung zu erreichen. Übersicht here mit vielen Google-able Beispielen dafür, wie das Gewicht Layouts in Code zu erreichen ...

+0

Was ich in meiner Anwendung versuche, ist nicht, das obere Layout und den unteren ViewPager mit einem Gewicht zu versehen, um ihnen die Hälfte des Bildschirms zu geben. Ich versuche, der Höhe des ViewPagers unterschiedliche Werte zuzuweisen Jedes Mal, wenn sich die ViewPager-Seite ändert, weil sich die Layouts, die die ViewPager-Seiten darstellen, in der Höhe unterscheiden. Und wenn zum Beispiel die erste Seite die Höhe von 200dp hat und ich den viewpager layout_height = "200dp" zuweise, werden beim Wechsel auf die zweite Seite (also 400dp) die unteren 200dp ausgeblendet! –

+0

Hey Andrei, Es klingt wie du musst die Ansicht messen, nachdem es gezeichnet wurde und aktualisieren Sie Ihre Pager Breite und Höhe, nachdem die Verlosung abgeschlossen ist. Ich habe vor kurzem eine ähnliche Aufgabe gestartet, während ich Google Charts in WebViews eingebunden habe. Sehen Sie sich [diese Antwort] (http://stackoverflow.com/a/4406090/1348379) zum Thema an. Es wird dir helfen. – OceanLife

6
  1. hinzufügen weightSum=2 Attribut an die Mutter LinearLayout und setzte orientation=vertical.
  2. Legen Sie das obere Kind LinearLayout layout_weight=1. Auch setzen layout_height=0dip
  3. Wickeln Sie die ViewPager in eine andere LinearLayout mit layout_weight=1 und layout_height=0dip
+0

Danke Josephus es funktionierte für mich –

+0

Funktioniert überhaupt nicht. –

+0

@bagusflyer Wenn Sie Ihren Code teilen, können wir möglicherweise sehen, was damit nicht stimmt. – josephus

-2

Verwenden RelativeLayout:

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

    <LinearLayout 
     android:id="@+id/layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 

    </LinearLayout> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_below="@+id/layout" > 

    </android.support.v4.view.ViewPager> 

</RelativeLayout> 
2

antwortete ich eine ähnliche Frage here.

Die Lösung erstreckt ViewPager onMeasure() außer Kraft zu setzen wrap_content nur Arbeit für die Höhe zu machen.

Verwandte Themen