2015-12-19 4 views
3

У меня есть 4 фрагмента, и я хочу создать своего рода вертикальный просмотрщик, но мне нужно сохранить видимый вид предыдущей страницы.Как создать вертикальную разбивку на страницы с фиксированным видом

Подробнее:
Фрагмент A имеет TextView (TV1) внизу и другие виды.
Фрагмент B имеет TextView (TV2) внизу и другие виды.
Фрагмент C имеет TextView (TV3) внизу и другие виды.
Я начал свою деятельность, Фрагмент A занимает весь макет.
Нажмите на кнопку -> Фрагмент A появится и появится фрагмент B, но TV1 все равно будет видимым и зафиксирован в верхней части экрана.
Нажмите на кнопку -> Фрагмент B выдвинется вверх и появится фрагмент C, но TV2 все равно будет видимым и зафиксированным в верхней части экрана (TV2 должен заменить TV1) ...
Если я нажму на TV2, то фрагмент B будет появляются выше фрагмента B.

Example Image

Как я могу получить такое поведение?

+0

Я думаю, что это может быть место, где вы используете 'Fragment', но должно использовать' CustomView' внутри 1 'Fragment'. Тогда ваше желаемое поведение намного проще – Blundell

+0

@Blundell Спасибо за ответ. Можете ли вы дать мне более подробную информацию? – vincenzo

ответ

1

Наконец-то мне удалось реализовать нечто похожее на то, о чем вы просите. Вот как это выглядит:

enter image description here

Это может немного Hacky, но это, как я архивировать:

Во-первых, я нуждался в некоторых TvFragment:

public class TvFragment extends android.support.v4.app.Fragment { 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.tv_fragment, container, false); 
     TextView textView = (TextView)rootView.findViewById(R.id.tvTextView); 
     textView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       ((OnScrollChanged)getActivity()).onScroll(TvFragment.this); 
      } 
     }); 

     return rootView; 
    } 

    public void display(int height, String tvTitle, int backgroundColor) { 
     if (getView() == null) { 
      return; 
     } 

     ViewGroup.LayoutParams params = getView().getLayoutParams(); 
     params.height = height; 
     getView().setLayoutParams(params); 

     TextView textView = (TextView)getView().findViewById(R.id.tvTextView); 
     textView.setText(tvTitle); 
     getView().setBackgroundColor(backgroundColor); 
    } 
} 

И это tv_fragment.xml:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 
    <TextView 
     android:layout_gravity="bottom" 
     android:id="@+id/tvTextView" 
     android:gravity="center" 
     android:textColor="#FFFFFF" 
     android:textSize="24sp" 
     android:background="@drawable/textview_backgroud_selector" 
     android:padding="8dp" 
     android:layout_margin="@dimen/tv_button_margin" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/tv_button_height" /> 
</FrameLayout> 

И тогда нам нужно заполнить Activity с нашим Фрагмент

Затем нам нужно иметь адаптер, чтобы заполнить его с нашими фрагментами:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/scrollView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
     <fragment 
      android:id="@+id/fragmentA" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:name="klogi.com.verticalpagination.TvFragment"/> 
     <fragment 
      android:id="@+id/fragmentB" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:name="klogi.com.verticalpagination.TvFragment"/> 
     <fragment 
      android:id="@+id/fragmentC" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:name="klogi.com.verticalpagination.TvFragment"/> 
    </LinearLayout> 
</ScrollView> 

Т.е. мы сохраняем все три фрагмента в одном ScrollView.

Маленький помощник interface для связи между фрагментом и деятельностью:

public interface OnScrollChanged { 
    void onScroll(Fragment fragment); 
} 

И последней частью является MainActivity классом:

public class MainActivity extends AppCompatActivity implements OnScrollChanged { 

    TvFragment fragmentA; 
    TvFragment fragmentB; 
    TvFragment fragmentC; 

    int bigFragmentHeight; 
    int smallFragmentHeight; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     getSupportActionBar().hide(); 

     DisplayMetrics metrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     bigFragmentHeight = metrics.heightPixels - getStatusBarHeight(); 
     smallFragmentHeight = bigFragmentHeight - getResources().getDimensionPixelSize(R.dimen.tv_button_height) - 2 * getResources().getDimensionPixelSize(R.dimen.tv_button_margin); 

     fragmentA = (TvFragment)getSupportFragmentManager().findFragmentById(R.id.fragmentA); 
     fragmentA.display(bigFragmentHeight, "TV1", Color.BLUE); 

     fragmentB = (TvFragment)getSupportFragmentManager().findFragmentById(R.id.fragmentB); 
     fragmentB.display(smallFragmentHeight, "TV2", Color.RED); 

     fragmentC = (TvFragment)getSupportFragmentManager().findFragmentById(R.id.fragmentC); 
     fragmentC.display(smallFragmentHeight, "TV3", Color.YELLOW); 

     ScrollView scrollView = (ScrollView)findViewById(R.id.scrollView); 
     scrollView.setOnTouchListener(new View.OnTouchListener(){ 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       return true; 
      } 
     }); 
    } 

    public int getStatusBarHeight() { 
     int result = 0; 
     int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
     if (resourceId > 0) { 
      result = getResources().getDimensionPixelSize(resourceId); 
     } 

     return result; 
    } 

    @Override 
    public void onScroll(Fragment fragment) { 
     ScrollView scrollView = (ScrollView)findViewById(R.id.scrollView); 
     int currentScroll = scrollView.getScrollY(); 

     if (fragment.equals(fragmentA)) { 
      if (currentScroll == 0) { 
       scrollView.smoothScrollTo(0, smallFragmentHeight); 
      } else { 
       scrollView.smoothScrollTo(0, 0); 
      } 
     } else if (fragment.equals(fragmentB)) { 
      if (currentScroll == smallFragmentHeight) { 
       scrollView.smoothScrollTo(0, smallFragmentHeight + bigFragmentHeight); 
      } else { 
       scrollView.smoothScrollTo(0, smallFragmentHeight); 
      } 
     } else if (fragment.equals(fragmentC)) { 
      // do nothing 
     } 
    } 
} 

Что я здесь делаю, - это отключение «нормальное» прокручивания ScrollView и зависит от того, какая кнопка фрагмента была нажата - плавная прокрутка вверх или вниз.

Я использовал также эти ресурсы: Dimens:

<resources> 
    <dimen name="tv_button_height">48dp</dimen> 
    <dimen name="tv_button_margin">8dp</dimen> 
</resources> 

цвета:

<resources> 
    <color name="textview_backgroud">#AAAAAA</color> 
    <color name="textview_backgroud_pressed">#777777</color> 
</resources> 

и textview_backgroud_selector:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" android:color="@color/textview_backgroud_pressed"/> 
    <item android:color="@color/textview_backgroud"/> 
</selector> 

Я загрузил полный проект в мой Dropbox - feel free to check it out

Вот и все! Надеюсь, это помогает

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