android - android使用支持库实现 TabListener

  显示原文与译文双语对照的内容
93 4

我试图实现标签导航,但我想确保有老版本的安卓的人仍然可以使用我的应用程序。

这个应用程序是相当简单的,我只想了解如何实现布局,然后添加缺失的位。

不过,我有一个容器 Activity,它扩展了 fragment Activity ( 。确保兼容性),这个 Activity 使用一个的ActionBar ( 我觉得我的问题在这里) 创建一个 TabView 。应用程序将尝试创建三个选项卡并将它们添加到,并且我想确保用户可以使用横向导航。

下面是我要实现的TabListener:

public static class TabListener<T extends Fragment> implements ActionBar.TabListener {
 private Fragment mFragment;
 private final Activity mActivity;
 private final String mTag;
 private final Class<T> mClass;
 public TabListener(Activity activity, String tag, Class<T> clz) {
 mActivity = activity;
 mTag = tag;
 mClass = clz;
 }
 public void onTabSelected(Tab tab, FragmentTransaction ft) {
 if (mFragment == null) {
 mFragment = Fragment.instantiate(mActivity, mClass.getName());
 ft.add(android.R.id.content, mFragment, mTag);
 } else {
 ft.attach(mFragment);
 }
 }
 public void onTabUnselected(Tab tab, FragmentTransaction ft) {
 if (mFragment!= null) {
 ft.detach(mFragment);
 }
 }
 public void onTabReselected(Tab tab, FragmentTransaction ft) {
 }
}

这是导入,因为我希望确保我使用的是支持库:

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.view.Menu;

不过,Eclipse 给我提供了 TabListener 方法的问题。它告诉我以下内容:"类型 LayoutContainer.TabListener 必须实现继承的抽象方法 ActionBar.TabListener.onTabSelected(ActionBar.Tab, FragmentTransaction)"

选择添加未实现方法basically基本添加 OnTabSelected OnTabReselected 和英镑OnTabUnselected方法,但这次将 fragment ( android 。fragment应用 Fragment )的不支持版本作为参数传递给 parameter 。

关于如何通过支持库另一种实现横向导航以确保兼容性的想法?

时间:原作者:0个回答

53 4
actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setDisplayShowTitleEnabled(false);
tabA = actionBar.newTab().setText("");
tabB = actionBar.newTab().setText("");
Fragment fragmentA = new AFragmentTab();
Fragment fragmentB = new BFragmentTab();
tabA.setTabListener(new MyTabsListener(fragmentA));
tabB.setTabListener(new MyTabsListener(fragmentB));
actionBar.addTab(tabA);
actionBar.addTab(tabB);

选项卡侦听器如下所示:

protected class MyTabsListener implements ActionBar.TabListener{
 private Fragment fragment;
 public MyTabsListener(Fragment fragment){
 this.fragment = fragment;
 }
 public void onTabSelected(Tab tab, FragmentTransaction ft){
 ft.add(R.id.layout2, fragment, null);
 }
 public void onTabReselected(Tab tab, FragmentTransaction ft) {
 }
 public void onTabUnselected(Tab tab, FragmentTransaction ft) {
 ft.remove(fragment);
 }
}

然后为每个选项卡创建一个类:

public class BFragmentTab extends Fragment {
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
 {
 return inflater.inflate(R.layout.login, container, false);
 }
}

但是请记住,android版本的操作栏不支持 3.0.如果你想在旧版本中使用它,我建议你使用actionBarSherlock库。

原作者:
83 0

嗯,虽然malek的作品并不直接回答这个问题。

你可以忽略在回调中获得的fragment 事务,并使用自己的事务:

android.support.v4.app.FragmentTransaction fft = mActivity.getSupportFragmentManager().beginTransaction();

确保你的Activity 是一个 FragmentActivity,你将能够启动一个新的fragment 事务。

此外,fragmentTransaction中的replace() 方法比 add() 和 remove ( ) 更加方便。

原作者:
85 3

关键是要使用

import android.support.v7.app.ActionBar;

。而不是。

import android.app.ActionBar;

这就避免了尼尔森所发布的。

的官方文档基础上,下面的完整示例被测试为从Android工作。

package com.example.myapp;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.view.*;
import android.widget.TextView;
public class NavigationTabsBasicDemoActivity extends ActionBarActivity {
 static public class TabListener<T extends Fragment> implements ActionBar
. TabListener {
 private Fragment mFragment;
 private final Activity mActivity;
 private final String mTag;
 private final Class<T> mClass;
/**
 * Constructor used each time a new tab is created.
 *
 * @param activity The host Activity, used to instantiate the
 * fragment
 * @param tag The identifier tag for the fragment
 * @param pClass The fragment's Class, used to instantiate the
 * fragment
 * @see <a
 * href="http://developer.android.com/guide/topics/ui/actionbar
 *. html#Tabs">
 * Developers Guide> Action Bar> Adding Navigation Tabs</a>
 */
 public TabListener(Activity activity, String tag, Class<T> pClass) {
 mActivity = activity;
 mTag = tag;
 mClass = pClass;
 }
 @Override
 public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
 if (mFragment == null) {
 mFragment = Fragment.instantiate(mActivity, mClass.getName());
 ft.add(android.R.id.content, mFragment, mTag);
 } else {
//If it exists, attach it in order to show it
 ft.attach(mFragment);
 }
 }
 @Override
 public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
 if (mFragment!= null) {
//Detach the fragment, because another one is about to be
//attached.
 ft.detach(mFragment);
 }
 }
 @Override
 public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
//Do nothing.
 }
 }
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
//No need for setContentView() to be used, Instead we use the root
//android.R.id.content as the container for each fragment,
//which is set in the TabListener
 ActionBar actionBar = getSupportActionBar();
 actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
 actionBar.setDisplayShowTitleEnabled(true);
 ActionBar.Tab tab = actionBar.newTab().setText("Artist").setTabListener(
 new TabListener<PlaceholderFragment>(this,
"artist",
 PlaceholderFragment
. class));
 actionBar.addTab(tab);
 tab = actionBar.newTab().setText("Album").setTabListener(
 new TabListener<PlaceholderFragment>(
 this,
"album",
 PlaceholderFragment.class));
 actionBar.addTab(tab);
 }
/**
 * In this example use one Fragment but display different data based on
 * which
 * tab is shown. In production you'd probably use a separate fragment.
 */
 public static class PlaceholderFragment extends Fragment {
 public PlaceholderFragment() {
 }
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
 Bundle savedInstanceState) {
 View rootView = inflater.inflate(
 R.layout.fragment_navigation_tabs_basic_demo,
 container,
 false);
 TextView outputTextView = (TextView) rootView.findViewById(
 R.id.output_textView);
 outputTextView.setText("Hello" + getTag());
 return rootView;
 }
 }
}
原作者:
60 0

我想实现 @nelson-ramirez,但是在访问mActivity时出错,所以这是这两个答案的组合,这是我的项目,它使用了一个标签导航,并使用了Facebook登录( 需要 support.v4 库) 。关键是创建一个 private mActivity,然后在启动侦听器时进入并分配,并创建自己的fragment 事务。另外,使用v4库将主 Activity 更改为 FragmentActivity,这允许访问 getSupportFragmentManager() 。

public class MyTabListener implements ActionBar.TabListener{
 private Fragment fragment;
 private FragmentActivity mActivity;
 public MyTabListener(Fragment fragment, FragmentActivity activity){
 this.fragment = fragment;
 this.mActivity = activity;
 }
 @Override
 public void onTabSelected(ActionBar.Tab tab, android.app.FragmentTransaction ft) {
 android.support.v4.app.FragmentTransaction fft = mActivity.getSupportFragmentManager().beginTransaction();
 fft.replace(R.id.fragment_container, fragment);
 fft.commit();
 }
 @Override
 public void onTabUnselected(ActionBar.Tab tab, android.app.FragmentTransaction ft) {
 android.support.v4.app.FragmentTransaction fft = mActivity.getSupportFragmentManager().beginTransaction();
 fft.remove(fragment);
 }
 @Override
 public void onTabReselected(ActionBar.Tab tab, android.app.FragmentTransaction ft) {
 }
}
原作者:
...