2012-12-30 5 views
10

Ich habe eine Kompatibilität ViewPager mit einem eingebetteten PagerTitleStrip Element und es funktioniert gut, aber Klicks auf den PagerTitleStrip nicht zu der entsprechenden Ansicht wechseln wie erwartet. Ich habe die Dokumente durchgesehen, aber das Widget verfügt über keine integrierten Methoden zum Anhängen von onClickListenern an das PagerTitleStrip-Objekt. Dies scheint ein bisschen komisch, da das wahrscheinlich die meisten Leute erwarten würden.Handhabung PagerTitleStrip klicken in Kompatibilität Fragment-basierte ViewPager

Also die Frage ist, wie würde ich den Titelstreifen klickbar machen?

Ich versuche auch herauszufinden, ob es eine Möglichkeit gibt, eine dicke Unterstreichung unter dem ausgewählten Titelstreifen zu zeigen, ohne einen TabHost hinzuzufügen, wenn überhaupt möglich. Hier

ist der Code:

Haupt Layout view_pager.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <android.support.v4.view.ViewPager 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/my_view_pager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 

     <android.support.v4.view.PagerTitleStrip 
      android:id="@+id/pager_title_strip" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="top" 
      android:background="#ccc" 
      android:textColor="#fff" /> 
    </android.support.v4.view.ViewPager> 

</LinearLayout> 

Die beiden Fragment-Layouts, die in die ViewPager gehen:

fragment_connect.xml (die zweite identisch ist so nicht enthalten)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/text_view_connect" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="connect" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 
</LinearLayout> 

Die Hauptaktivitätsklasse StandardViewPagerAct ivity.java:

package com.example.standardviewpager; 

import java.util.List; 
import java.util.Vector; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.view.PagerTitleStrip; 
import android.support.v4.view.ViewPager; 
import android.view.Menu; 

public class StandardViewPagerActivity extends FragmentActivity { 

    private MyPagerAdapter pagerAdapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.view_pager); 
     ViewPager myPager = (ViewPager) findViewById(R.id.my_view_pager); 
     PagerTitleStrip pagerStrip = (PagerTitleStrip) findViewById(R.id.pager_title_strip); 
     // TODO: add underline for selected title strip 
     myPager.setAdapter(pagerAdapter); 
     myPager.setCurrentItem(0); 
     initialisePaging(); 
    } 

    private void initialisePaging() { 

     List<Fragment> fragments = new Vector<Fragment>(); 
     fragments.add(Fragment.instantiate(this, ConnectFragment.class.getName())); 
     fragments.add(Fragment.instantiate(this, ProfilesFragment.class.getName())); 
     this.pagerAdapter = new MyPagerAdapter(super.getSupportFragmentManager(), fragments); 
     ViewPager pager = (ViewPager) super.findViewById(R.id.my_view_pager); 
     pager.setAdapter(this.pagerAdapter); 
    } 
} 

Die Adapterklasse MyPagerAdapter.java:

package com.example.standardviewpager; 

import java.util.List; 

import android.os.Parcelable; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 

public class MyPagerAdapter extends FragmentPagerAdapter { 

    private List<Fragment> fragments; 

    public MyPagerAdapter(FragmentManager supportFragmentManager, List<Fragment> fragments) { 
     super(supportFragmentManager); 
     this.fragments = fragments; 
    } 

    @Override 
    public int getCount() { 
     return this.fragments.size(); 
    } 

    @Override 
    public void destroyItem(View arg0, int arg1, Object arg2) { 
     ((ViewPager) arg0).removeView((View) arg2); 
    } 

    @Override 
    public Parcelable saveState() { 
     return null; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return String.format("Title %d", position); 
    } 

    @Override 
    public Fragment getItem(int position) { 
      return this.fragments.get(position); 
    } 
} 

Und schließlich die beiden identischen Fragment Implementierungen, darunter nur die erste - ConnectFragment.java.

package com.example.standardviewpager; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class ConnectFragment extends Fragment { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.fragment_connect, container, false); 
     TextView textView = (TextView) layout.findViewById(R.id.text_view_connect); 
     textView.setText("onCreateView() Connect"); 
     return (View)layout; 
     } 
} 

Antwort

24

Die Frage ist also, wie würde ich den Titel Streifen klickbare machen?

Sie fork es und machen Sie Ihre eigene Implementierung, die anklickbar ist. Oder Sie wechseln zu PagerTabStrip, die anklickbar ist. Oder Sie wechseln zu einem der ViewPagerIndicator Indikatoren, der zufällig klickbar ist und ein Aussehen hat, das Ihnen gefällt.

Zitiert the documentation for PagerTitleStrip:

PagerTitleStrip ist eine nicht-interaktive Anzeige der aktuellen, nächsten und vorherigen Seiten eines ViewPager ... Für eine interaktive Anzeige, PagerTabStrip zu sehen.

+2

'PagerTabStrip' ist genau das, was ich brauchte. Vielen Dank! – ccpizza

4

Ich nehme an, das ist viel zu spät und die OP muss verschoben haben, aber für diejenigen, die hier kamen gerade für ein kleines Widget suchen, benutzen Sie bitte meine Gabel here

0

Ich würde auch eine Notiz hinzufügen finden Andere (wie ich), die hierher kamen, wollten den PagerTitleStrip aus anderen Gründen klickbar machen. Sie können es tatsächlich klickbar machen. Um dies zu tun, machen Sie es in der XML anklickbar und fügen Sie eine XML-Zeile "onClick" hinzu, die auf eine Funktion verweist (genau wie bei einer normalen Schaltfläche).

Der Schlüssel von diesem Punkt ist, dass Sie dann basierend auf diesem Klick wissen möchten, auf welcher Seite Sie sich befinden, da sich das Verhalten wahrscheinlich ändert.In diesem Fall erhält die folgende Zeile das aktuelle Element zur Verwendung in Ihrem nachfolgenden Code (in meinem Fall wird eine Toast-Nachricht angezeigt).

int CurrentItem = this.mViewPager.getCurrentItem();