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 。

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

时间: 原作者:

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) {



 }


}



...