2015-03-23 2 views
0

Когда я прочитал документацию, между фрагментами происходит скольжение между представлениями. Я разрабатываю приложение как Activity < -> Фрагмент отношений, то есть я могу иметь несколько фрагментов в одной активности. Я нахожу это разумным и более легким для понимания. Моя проблема возникает, когда я хотел бы преобразовать существующее действие с двумя фрагментами для перехода между другим действием, которое может иметь несколько фрагментов. Я рассматриваю фрагменты внутри фрагментов, но мне не нравится этот подход. Я хотел бы знать, есть ли способ сделать это на Android?Скольжение между активностью с несколькими фрагментами

Во-вторых, все учебники указывают на фрагмент, который содержит место для просмотра данных. Это легко осуществить таким образом. Но я не просматриваю какой-то источник данных, я просматриваю действия. Мне нужно как-то надежное общение между двумя действиями, чтобы ActivityB отправлял данные в ActivityA. Хотя я не осуществляю много действий, чтобы листать, но только 2 действия. Я в настоящее время реализую код, как описано в документах, но, похоже, это не то, что я хочу. Я видел какое-то приложение, которое делает подобное, и мне нужна была аналогичная функция. Есть идеи?

Спасибо.

+0

Я не уверен, понимаю ли я вашу проблему. Но вы можете отправлять данные, когда вы переключаетесь с одного действия на другое с намерением. Пример из http://developer.android.com/training/basics/firstapp/starting-activity.html: public void sendMessage (View view) { Цель намерения = новое намерение (это, DisplayMessageActivity.class); EditText editText = (EditText) findViewById (R.id.edit_message); String message = editText.getText(). ToString(); intent.putExtra (EXTRA_MESSAGE, message); startActivity (намерение); } – Jure

+0

Правильно мы можем это сделать, но это касается прокрутки между представлениями. Я хочу что-то вроде первой страницы, на которой показан видеоплеер, содержащий два фрагмента: Fragment1> TitleBar и Fragment2> Video на второй странице. Я могу показать какой-то список доступных видео. Проблема в том, что у меня уже есть код и его довольно здоров. У меня есть фрагменты, обменивающиеся с другим фрагментом их базовыми действиями. –

ответ

0

У меня есть решение сейчас. Я сделал, что создал Фрагмент, который добавит 2 дочерних фрагмента. Эти 2 дочерних фрагмента имеют список и фрагменты фильтра. Вместо того, чтобы делать это через Activity, я сделал это через Fragments. В случае, если кто-то сталкивается с подобной проблемой:

Так вот что Родитель фрагмент Посмотрел, как:

package com.neonwarge.android.note; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.util.Log; 

public class PagerActivity extends BackboneActivity implements  NoteListSubFragment.NoteListCallback 
{ 
private final static int NUM_PAGES = 2; 
private ViewPager mPager; 
private PagerAdapter mPagerAdapter; 
private int mCurrentPage; 

private HomePageFragment mHomePageFragment; 
private NoteDateSelectorFragment mNoteDateSelectorFragment; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    Log.i(NoteApplication.TAG, "PagerActivity.onCreate() has been called."); 
    setTargetLayout(R.layout.activity_pager); 

    mPagerAdapter = new PagerAdapter(getSupportFragmentManager()); 
    mPager = (ViewPager) findViewById(R.id.activity_home_screen_pager); 
    mPager.setAdapter(mPagerAdapter); 

    mCurrentPage = 0; 
    mPager.setCurrentItem(mCurrentPage); 
} 

private class PagerAdapter extends FragmentStatePagerAdapter 
{ 
    public PagerAdapter(FragmentManager fm) 
    { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) 
    { 
     switch(position) 
     { 
      case 0: 
       mHomePageFragment = new HomePageFragment(); 
       return mHomePageFragment; 

      case 1: 
       mNoteDateSelectorFragment = new NoteDateSelectorFragment(); 
       return mNoteDateSelectorFragment; 

      default: break; 
     } 

     return null; 
    } 

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


@Override 
public void onNoteItemSelected(Note note , int type) 
{ 
    Intent intent = new Intent(this , NoteActivity.class); 
    intent.putExtra(NoteFragment.EXTRA_NOTE_ID, note.getNoteID()); 
    intent.putExtra(NoteFragment.EXTRA_INSTANCE_TYPE, type); 
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    startActivityForResult(intent , 0); 
} 

@Override 
public void onActivityResult(int request, int result, Intent intent) 
{ 
    super.onActivityResult(request, result, intent); 

    Log.i(NoteApplication.TAG, "PageActivity.onActivityResult() called."); 

    if(intent == null) 
     return; 

    switch(mCurrentPage) 
    { 
     case 0: 
      mHomePageFragment.updateSubFragments(request, result, intent); 
      break; 

     case 1: 
      break; 

     default: 
      Log.i(NoteApplication.TAG, "PagerActivity.onActivityResult(): page not supported."); 
      break; 
    } 
} 
} 

Заметил вот что два фрагмента я предполагаю иметь (который первоначально добавляется активностью) в настоящее время прилагаются в родительский фрагмент с именем HomePageFragment.

Вот как я добавить два ребенка-фрагментов в HomePageFragment:

public class HomePageFragment extends Fragment 
{ 
private NoteListSubFragment mNoteListSubFragment; 
private NoteFilterSubFragment mNoteFilterSubFragment; 

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

    View v = inflater.inflate(R.layout.fragment_homescreen, container, false); 

    // add sub_fragments here. 
    FragmentManager cfm = getChildFragmentManager(); 
    FragmentTransaction cft = cfm.beginTransaction(); 

    mNoteListSubFragment = new NoteListSubFragment(); 
    mNoteFilterSubFragment = new NoteFilterSubFragment(); 

    cft.add(R.id.layout_fragment_container_filter, mNoteFilterSubFragment); 
    cft.add(R.id.layout_fragment_container_list, mNoteListSubFragment); 
    cft.commit(); 

    return v; 
} 

public void updateSubFragments(int request, int result, Intent intent) 
{ 
    if(mNoteListSubFragment != null) 
     mNoteListSubFragment.onNoteListUpdated(); 
} 

} 

Как вы можете видеть на этих двух линиях:

 cft.add(R.id.layout_fragment_container_filter, mNoteFilterSubFragment); 
    cft.add(R.id.layout_fragment_container_list, mNoteListSubFragment); 

Это на самом деле нацелен на FrameLayout к которой этот фрагмент будет появляются. Изначально я просто повторно файл макета активность и раздувать фрагмент на свои места:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:baselineAligned="false" 
android:padding="7dp"> 

<FrameLayout   
    android:id="@+id/layout_fragment_container_filter" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" /> 

<FrameLayout   
    android:id="@+id/layout_fragment_container_list" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="30"/> 

</LinearLayout> 

Я надеюсь, что это поможет кому-то.