アンドロイドスライドタブレイアウト+ビューページャーには12個のアイテムがあります。選択したタブは、左から右にスライドしながら、プレイストアと同じ中心にする必要があります。どうすればいいのか教えてください。私のアプリケーションでは、アクティブなタブは常に画面の左にあります。アンドロイドでアクティブなタブの中心を合わせる方法スライドタブのレイアウト
答えて
Googleがsliding tab layoutのためのサンプルを提供してきました。しかし、SlidingTabLayoutクラスの実装では、選択したタブを中央揃えにするようには設計されていませんでした。スクロール方法を変更して、画面の選択/アクティブなタブの中央にします。ここで、コード変更がある:
クラス名:SlidingTabLayout
行番号:241、scrollToTab {}
更新方法:
private void scrollToTab(int tabIndex, int positionOffset) {
final int tabStripChildCount = mTabStrip.getChildCount();
if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) {
return;
}
View selectedChild = mTabStrip.getChildAt(tabIndex);
if (selectedChild != null) {
int targetScrollX = selectedChild.getLeft() + positionOffset;
if (tabIndex > 0 || positionOffset > 0) {
// If we're not at the first child and are mid-scroll, make sure we obey the offset
targetScrollX -= (getWidth()-selectedChild.getWidth())/2;
}
scrollTo(targetScrollX, 0);
}
}
スクロールビューの幅を測定するためにディスプレイを取得する必要はありません。getWidth();)を呼び出します。 –
Yuri Heupa、答えを更新しました。あなたの提案をありがとう。 –
+1それは働いています:)しかし、中央に置く努力の末尾には少しばかげがあります。以下はそれを修正します。 :)しかし、良い仕事。 –
私のアプローチはShripad Bhat溶液を少し異なります、スライドの端にあるタブを跳ね返します。ここで
は私の回避策だ...
onPageScrolled
方法の変更:scrollToTab
方法に
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
int tabStripChildCount = mTabStrip.getChildCount();
if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) {
return;
}
mTabStrip.onViewPagerPageChanged(position, positionOffset);
View selectedTitle = mTabStrip.getChildAt(position);
int selectedOffset = (selectedTitle == null) ? 0 : selectedTitle.getWidth();
int nextTitlePosition = position + 1;
View nextTitle = mTabStrip.getChildAt(nextTitlePosition);
int nextOffset = (nextTitle == null) ? 0 : nextTitle.getWidth();
int extraOffset = (int)(0.5F * (positionOffset * (float)(selectedOffset + nextOffset)));
scrollToTab(position, extraOffset);
if (mViewPagerPageChangeListener != null) {
mViewPagerPageChangeListener.onPageScrolled(position, positionOffset, positionOffsetPixels);
}
}
変更:
private int mLastScrollTo;
private void scrollToTab(int tabIndex, int positionOffset) {
final int tabStripChildCount = mTabStrip.getChildCount();
if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) {
return;
}
View selectedChild = mTabStrip.getChildAt(tabIndex);
if (selectedChild != null && selectedChild.getMeasuredWidth() != 0) {
int targetScrollX = ((positionOffset + selectedChild.getLeft()) - getWidth()/2) + selectedChild.getWidth()/2;
if (targetScrollX != mLastScrollTo) {
scrollTo(targetScrollX, 0);
mLastScrollTo = targetScrollX;
}
}
}
素晴らしい仕事の仲間。それは魅力のように働く:)もし可能ならば+10。 :) –
LGTM、ありがとう! :D –
ありがとう、それは素晴らしいです。しかし、どのように最初のタブ項目を中央に作るのですか? – NickUnuchek
もこの問題を抱えていました。 tabLayoutのみtabContentStartオプションを提供し、両面が必要:
public class CenteringTabLayout extends TabLayout {
public CenteringTabLayout(Context context) {
super(context);
}
public CenteringTabLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CenteringTabLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
View firstTab = ((ViewGroup)getChildAt(0)).getChildAt(0);
View lastTab = ((ViewGroup)getChildAt(0)).getChildAt(((ViewGroup)getChildAt(0)).getChildCount()-1);
ViewCompat.setPaddingRelative(getChildAt(0), (getWidth()/2) - (firstTab.getWidth()/2),0,(getWidth()/2) - (lastTab.getWidth()/2),0);
}
}
あなたのコードはViewCompatを使用している行に例外をスローしています、あなたは本当にしたいことを理解することができるように少しあなたのコードを説明してください。 – EyadMhanna
私はandroid.support.design.widget.TabLayoutを拡張しました。最初の子はSlidingTabStripであり、すべてのタブはその子の1つですが、このSlidingTabStripにパディングを設定しようとしています でも、私の場合でも最後のタブを中心に配置しません。まだ見つけられなかった理由。 –
- 1. LWUITの中心合わせ方法は?
- 2. ハイチャートのyAxisタイトルの中心を合わせる方法
- 3. mdヒントの中心を合わせる方法(material2)
- 4. wj-popupをowner要素で中心合わせする方法
- 5. オーバレイの中心を合わせる
- 6. フレックスの中心を合わせる
- 7. 画像の中心を合わせる
- 8. データセットの中心を合わせる
- 9. wxScrolledWindowの中心合わせを行う方法は?
- 10. Android:コントロールを相対レイアウトの別のコントロールの中心に合わせる
- 11. 入力ボックスをIonicに中心合わせする方法
- 12. テーブルを中心にして中心を合わせる
- 13. イメージのサイズ変更と中心合わせ方法
- 14. UIPopoverController内のcontentViewの中心合わせ
- 15. テーブルセルを中心に合わせる
- 16. フォームを中心に合わせる
- 17. アンドロイドの親ビュー/レイアウトの中心の真上にビューを配置する方法
- 18. CSSメディアクエリーでモバイルデバイスのdiv要素の中心を合わせる方法
- 19. Xamarin.Formsはアンドロイドのレイアウトを中心にしていません
- 20. 角材2テーブルヘッダの中心合わせ
- 21. ボタン中心の位置合わせ -
- 22. スライドタブがhtmlの3つのタブを表示する方法
- 23. div内のdivを背景画像で中心合わせする方法
- 24. DIV内で水平方向に中心を合わせる
- 25. W3.CSSコンテナを別のコンテナの中心に合わせる方法
- 26. OpenGLを使用してお互いの中心を合わせる方法は?
- 27. CoreTextテキストの水平方向の中心合わせ
- 28. jQuery MobileでDIVの内容を中心に合わせる
- 29. Kivyでオブジェクトの中心を合わせる
- 30. コントロールをWindowsフォームデザイナーのフォームの中心に合わせる
、あなたのプロジェクトで[PagerTabStrip](http://developer.android.com/reference/android/support/v4/view/PagerTabStrip.html)を使用しています(つまり、Google Playアプリが使用しているもの)。代わりに通常のタブを使用しているように見えます。 – Marko
いいえ、スライディングタブレイアウト用のサンプルクラスとしてGoogleが提供するSlidingTabLayoutクラスを使用しました。また、私はプレイストアのようなタブのタイトルをスライドさせることはできませんPagerTabStripを試してみました。 SlidingTabLayoutはHorizontalScrollViewを拡張したものです。 –
私は参照してください。 Androidデベロッパーからこの[video](https://www.youtube.com/watch?v=tRg_eDfQ8fk)を見ると、これは予想された動作ではないことがわかります。 Google Playの効果を得るには、** PagerTabStrip **を使用する必要があります。これは実装が非常に簡単で、チェックアウト[このチュートリアル](http://codetheory.in/android-pagertabstrip-pagertitlestrip-viewpager/)です。 – Marko