2015-04-04 2 views
1

У меня есть ViewPager с 3 раздвижными fragments. Каждый из fragment имеет listview, который содержит некоторые изображения. Я пытаюсь показать новый fragment над viewpager (как действие), когда щелкнули одно из изображений в listview, а также сможете вернуться назад к viewpager, когда нажата кнопка «Назад».Показанный фрагмент над viewpager

Мой код listview OnClick, который находится внутри фрагмента следующим образом (для тестирования, я использую onClick на всей listview и не образы)

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Log.d(TAG,"Clicked"); 
      ItemDetailFragment fragment = ItemDetailFragment.newInstance("ab","cd"); 
      FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
      transaction.replace(R.id.containerr,fragment); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
     } 
}); 

В заявлении журнала печатает отлично, но фрагмент не появляется.

Вот моя деятельность, которая имеет viewpager

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:theme="@android:style/Theme.WithActionBar"> 

    <com.firstapp.myapplication.CustomViews.SlidingTabLayout 
     android:id="@+id/sliding_tabs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 

    <android.support.v4.view.ViewPager 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/viewPager"> 

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

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/containerr"> 
    </FrameLayout> 

</LinearLayout> 

Пожалуйста, помогите.

Также, в примерах в документах android, любое взаимодействие во фрагменте, которое приводит к транзакции фрагмента, сначала передается родительской активности, которая обрабатывает добавление или замену нового фрагмента. Я обрабатываю это здесь в самом фрагменте. Какой из них правильный, и в чем разница между этими двумя методами?

EDIT: Мне нужно добавить фрагмент поверх viewPager, а не ему. Это похоже на появление нового экрана при нажатии элемента внутри фрагмента viewpager.

Спасибо!

+0

Если вам нужно «над viewpager», то лучше всего сделать, начать новую деятельность и вставить в нее фрагмент ItemDetail. Это рекомендуемый способ вместо прикрепления фрагмента к viewpager. –

+0

Привет! Спасибо за ответ. Я не пытаюсь прикрепить «фрагмент» к «viewpager», а к родительской активности, которая имеет пейджер представления. – aandis

+0

Вы имеете в виду, что фрагмент ItemDetail является одним из 3 скользящих фрагментов? –

ответ

2

Я решил это, добавив viewpager в fragment (вместо того, чтобы иметь его непосредственно в моем activity).

Моя активность сейчас

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/fragment_container" 
android:layout_width="match_parent" 
android:layout_height="match_parent" /> 

и я перенес предыдущую схему деятельности (упомянутый в вопросе) к ViewPagerFragment

Сейчас в моей деятельности-х onCreate я

ViewPagerFragment viewPagerFragment = new ViewPagerFragment(); 

getSupportFragmentManager().beginTransaction() 
     .add(R.id.fragment_container, viewPagerFragment) 
     .commit(); 

и для показа нового fragment над viewpager при щелчке элемента внутри фрагмента viewpager, я делаю

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     mListener.onFragmentInteraction(null); 
    } 
}); 

Слушатель представляет собой интерфейс, реализованный в родительской активности следующим образом

@Override 
public void onFragmentInteraction(Uri uri) { 
    ItemDetailFragment itemDetailFragment = ItemDetailFragment.newInstance("ab","cd"); 
    getSupportFragmentManager().beginTransaction() 
      .replace(R.id.fragment_container,itemDetailFragment) 
      .addToBackStack(null) 
      .commit(); 
} 

Я реализовал это через интерфейс слушателя потому, что в соответствии с docs

Все Фрагмент к -Обратная связь осуществляется через связанную с ней активность. Два фрагмента никогда не должны связываться напрямую.

И теперь это работает! : D

+0

вы можете поделиться файлом xml. как вы добавляете viewpager к фрагменту? – lacs

-1

Инициализировать свой фрагмент в классе активность и добавить их в ViewPager, как показано ниже

List<Fragment> fragments = getFragments(); 
pageAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments); 
pager = (ViewPager) findViewById(R.id.viewpager); 
pager.setAdapter(pageAdapter); 

Добавить фрагменты вашего ViewPager

private List<Fragment> getFragments() { 

    List<Fragment> fList = new ArrayList<Fragment>(); 

    fList.add(Fragment1.newInstance()); 
    fList.add(Fragment2.newInstance()); 
    fList.add(Fragment3.newInstance()); 

    return fList; 
} 

/********************** Fragment Page adapter *************************/ 
private class MyPageAdapter extends FragmentPagerAdapter { 
    private List<Fragment> fragments; 

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

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

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

И создать классы фрагментов и обрабатывать ListView внутри те классы

+0

Спасибо за ответ, но это не позволяет мне добавить фрагмент над ViewPager, а вместо этого «в» viewPager. – aandis

+0

вы можете использовать другой фрагмент и основной макет и отображать его вид в видимой области и исчезать, когда пользователь нажимает на список. – Kunu

Смежные вопросы