package org.commcare.views; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.RelativeLayout; import org.commcare.adapters.EntityDetailPagerAdapter; import org.commcare.adapters.ListItemViewStriper; import org.commcare.dalvik.R; import org.commcare.suite.model.Detail; import org.commcare.utils.AndroidUtil; import org.javarosa.core.model.instance.TreeReference; /** * Widget that combines a ViewPager with a set of page titles styled to look like tabs. * User can navigate either by swiping through pages or by tapping the tabs. * * @author jschweers */ public class TabbedDetailView extends RelativeLayout { private FragmentActivity mContext; private LinearLayout mMenu; private ViewPager mViewPager; private View mViewPageTabStrip; private int mEvenColor; private int mOddColor; public TabbedDetailView(Context context) { super(context); } public TabbedDetailView(Context context, AttributeSet attrs) { super(context, attrs); if (isInEditMode()) return; mContext = (FragmentActivity)context; loadViewConfig(context, attrs); } private void loadViewConfig(Context context, AttributeSet attrs) { TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TabbedDetailView); int[] defaults = AndroidUtil.getThemeColorIDs(context, new int[]{R.attr.detail_even_row_color, R.attr.detail_odd_row_color}); mEvenColor = typedArray.getColor(R.styleable.TabbedDetailView_even_row_color, defaults[0]); mOddColor = typedArray.getColor(R.styleable.TabbedDetailView_odd_row_color, defaults[1]); typedArray.recycle(); } @SuppressLint("NewApi") public TabbedDetailView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = (FragmentActivity)context; } /* * Attach this view to a layout. */ public void setRoot(ViewGroup root) { LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.tabbed_detail_view, root, true); mMenu = (LinearLayout)root.findViewById(R.id.tabbed_detail_menu); mViewPager = (ViewPager)root.findViewById(R.id.tabbed_detail_pager); mViewPager.setId(AndroidUtil.generateViewId()); mViewPageTabStrip = root.findViewById(R.id.pager_tab_strip); mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { markSelectedTab(position); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }); } public void showMenu() { mMenu.setVisibility(VISIBLE); } /** * Get form list from database and insert into view. */ public void refresh(Detail detail, TreeReference reference, int index) { EntityDetailPagerAdapter entityDetailPagerAdapter = new EntityDetailPagerAdapter(mContext.getSupportFragmentManager(), detail, index, reference, new ListItemViewStriper(this.mOddColor, this.mEvenColor)); mViewPager.setAdapter(entityDetailPagerAdapter); if (!detail.isCompound()) { if (mViewPageTabStrip != null) { mViewPageTabStrip.setVisibility(GONE); } } } /** * Style one tab as "selected". */ private void markSelectedTab(int position) { if (mMenu.getChildCount() <= position) { return; } for (int i = 0; i < mMenu.getChildCount(); i++) { mMenu.getChildAt(i).setBackgroundDrawable(getResources().getDrawable(R.drawable.title_neutral_tab_vertical)); } mMenu.getChildAt(position).setBackgroundDrawable(getResources().getDrawable(R.drawable.title_case_tab_vertical)); } public int getCurrentTab() { return mViewPager.getCurrentItem(); } public int getTabCount() { return mViewPager.getAdapter().getCount(); } }