Обращение с PagerTitleStrip кликом по совместимости Фрагментный ViewPager

У меня есть совместимость ViewPager со встроенным PagerTitleStrip, и он работает нормально, но клики на PagerTitleStrip не переключаются на соответствующий просмотр, как ожидалось. Я просмотрел документы, но виджет не имеет встроенных методов для привязки onClickListeners к объекту PagerTitleStrip. Это кажется немного странным, потому что это, вероятно, то, что ожидали большинство людей.

Итак, вопрос в том, как сделать заголовок заголовком доступным?

Я также пытаюсь выяснить, есть ли способ показать толстую подчеркивание под выбранной полосой заголовка без добавления TabHost, если это вообще возможно.

Вот код:

Основной макет 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>

Два фрагментарных макета, которые входят в ViewPager:

fragment_connect.xml(вторая идентична, поэтому не включена)

<?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>

Основной класс активности StandardViewPagerActivity.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);
    }
}

Класс адаптера 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);
    }
}

И, наконец, две идентичные реализации Fragment, включая только первый - 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;
        }
}

Ответ 1

Итак, вопрос в том, как бы сделать заголовок заголовком доступным?

Вы раскошелитесь и сделаете свою собственную реализацию кликабельной. Или вы переключаетесь на PagerTabStrip, который можно щелкнуть. Или вы переключаетесь на один из индикаторов ViewPagerIndicator, один из которых оказывается кликабельным и имеет вид, который вам нравится.

Цитирование документации для PagerTitleStrip:

PagerTitleStrip является неинтерактивным индикатором текущей, следующей и предыдущей страниц ViewPager... Для интерактивного индикатора см. PagerTabStrip.

Ответ 2

Я полагаю, что это слишком поздно, и OP должен был двигаться дальше, но для тех, кто только что пришел, ища крошечный виджет, найдите мою вилку здесь

Ответ 3

Я также добавил бы примечание для других (таких как я), которые пришли сюда, желая сделать PagerTitleStrip доступным по другим причинам. Вы действительно можете сделать его интерактивным. Для этого вы делаете его кликабельным в xml и добавляете строку "onClick" xml, которая указывает на функцию (точно так же, как с обычной кнопкой).

Ключ от этого момента состоит в том, что тогда вы захотите узнать, на какой странице вы находитесь, на основе этого щелчка, потому что поведение, вероятно, изменится. В этом случае следующая строка предоставит вам текущий элемент для использования в вашем последующем коде (отображая сообщение Toast в моем случае).

    int CurrentItem = this.mViewPager.getCurrentItem();