2013-06-21 1 views
1

В настоящее время я работаю над вкладкой с использованием фрагментов для приложения для Android> = 4.0. Вкладки не находятся в панели действий. Мне не нужна новая активность для каждой вкладки. Я всегда показываю то же количество и данные того же типа.Использование фрагментов для просмотра в виде вкладок для Android> = 4.0 (нет панели действий)

Поскольку в моих целях нет «лучшей практики» (я думаю ?!) Я размещаю свой код здесь (который работает). Надеюсь, вы найдете несколько отрывков, где я могу сделать некоторые улучшения (производительности) и где я сделал что-то, что не является «лучшей практикой» (например, архитектура). Я уже думаю о проходе, в котором я использую Gridview в классе фрагментов.

Деятельность, которая должна показать вкладками расположение

public class LevelActivity extends Activity { 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_level); 
} 
} 

Файл XML для вышеупомянутой деятельности

<fragment 
     class="com.test.puzzle.tabs.TabsFragment" 
     android:id="@+id/tabs_fragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 
</LinearLayout> 

Мой класс фрагмент:

public class TabsFragment extends Fragment implements OnTabChangeListener { 

public static final String TAB_1 = "Pack 1"; 
public static final String TAB_2 = "Pack 2"; 

private View mRoot; 
private TabHost mTabHost; 
private int mCurrentTab; 

private TabFragmentAdapter mAdapter; 

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

    mRoot = inflater.inflate(R.layout.tabs_fragment, container, false); 
    mTabHost = (TabHost) mRoot.findViewById(android.R.id.tabhost); 
    setupTabs(); 
    return mRoot; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    setRetainInstance(true); 

    mTabHost.setOnTabChangedListener(this); 
    mTabHost.setCurrentTab(mCurrentTab); 

    updateTab(R.id.tab_1); 
} 

private void setupTabs() { 
    mTabHost.setup(); // you must call this before adding your tabs! 
    mTabHost.addTab(newTab(TAB_1, R.id.tab_1)); 
    mTabHost.addTab(newTab(TAB_2, R.id.tab_2)); 
} 

private TabSpec newTab(String tag, int tabContentId) { 
    TabSpec spec = mTabHost.newTabSpec(tag); 
    spec.setContent(tabContentId); 
    spec.setIndicator(tag); 
    return spec; 
} 

@Override 
public void onTabChanged(String tabId) { 
    if (TAB_1.equals(tabId)) { 
     updateTab(R.id.tab_1); 
     mCurrentTab = 0; 
    } 
    if (TAB_2.equals(tabId)) { 
     updateTab(R.id.tab_2); 
     mCurrentTab = 1; 
    } 
} 


private void updateTab(int viewId) { 
    final GridView grid = (GridView) mRoot.findViewById(viewId); 
    if (mAdapter == null) { 
     mAdapter = new TabFragmentAdapter(mRoot.getContext(), mTabHost.getCurrentTabTag()); 
    } 
    grid.setAdapter(mAdapter); 
} 
} 

Мой файл макета XML для фрагмента:

<?xml version="1.0" encoding="utf-8"?> 
<TabHost 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/tabhost" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

<LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

    <TabWidget 
      android:id="@android:id/tabs" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"/> 

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

     <GridView 
       android:id="@+id/tab_1" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:numColumns="2" 
       android:verticalSpacing="20dp" 
       android:horizontalSpacing="20dp"> 
     </GridView> 

     <GridView 
       android:id="@+id/tab_2" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:numColumns="2" 
       android:verticalSpacing="20dp" 
       android:horizontalSpacing="20dp"> 
     </GridView> 

    </FrameLayout> 
</LinearLayout> 
</TabHost> 

Мой адаптер класса для данных

public class TabFragmentAdapter extends BaseAdapter { 

private Context mContext; 
private String mPackString; 

private final String[] WORDS = {"test3", "test6", "test4", "test4", 
     "test1", "test2", "test7", "test3", "test9", "test6", 
     "test3", "test7"}; 

public TabFragmentAdapter(Context context, String packString) { 

    mContext = context; 
    mPackString = packString; 

} 

@Override 
public int getCount() { 
    return WORDS.length; 
} 

@Override 
public Object getItem(int i) { 
    return WORDS[i]; 
} 

@Override 
public long getItemId(int i) { 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    ViewHolder viewHolder; 

    if (view == null) { // if it's not recycled, initialize some attributes 
     final LayoutInflater inflater = (LayoutInflater) mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.list_item, parent, false); 
     viewHolder = new ViewHolder(view); 
     view.setTag(viewHolder); 
    } else { 
     viewHolder = (ViewHolder) view.getTag(); 
    } 

    viewHolder.getTextView().setText(WORDS[position]); 

    return view; 
} 

private class ViewHolder { 
    private final View mRoot; 
    private TextView mText; 

    public ViewHolder(View root) { 
     mRoot = root; 
    } 

    public TextView getTextView() { 
     if (mText == null) { 
      mText = (TextView) mRoot.findViewById(R.id.text); 
     } 
     return mText; 
    } 
} 

} 

Мой список элементов XML

<?xml version="1.0" encoding="utf-8"?> 


<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/text" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 

     ></TextView> 

ответ

1

Одно fragements я заметил, что вы должны сделать это:

mRoot = inflater.inflate(R.layout.tabs_fragment, container, false); 

вместо этого

mRoot = inflater.inflate(R.layout.tabs_fragment, null); 

Проверить эту ссылку:

http://www.doubleencore.com/2013/05/layout-inflation-as-intended/

+0

Большое спасибо за ссылку! – user993441

+1

Не беспокойтесь, пока я нахожусь, я думаю, что 'fill parent' устарел и' match parent' должен использоваться – MattWilliams89

2

Я ответил related question, которые могли бы помочь вам, как это подробно описано, как сделать вкладки с фрагментами. Мое предложение состоит в том, чтобы использовать отдельные фрагменты для каждой вкладки (я думаю, что это делает все намного проще), но в зависимости от вашей реализации вы, возможно, захотите продолжить свое направление.

+0

Я думаю, что не могу использовать ваш подход, если я не хочу использовать библиотеки поддержки – user993441