1

私は Iphone のような TabBar を実装しようとしていて、ListView に情報を表示したいと思っていました。都市を選択した後、その都市に関連するものを含む別のリストを取得しますが、新しいビューを呼び出すと、TabBAr が失われ、 **次のビューに情報を表示するには、どのアクティビティが機能していてもTABBARは一番下にある必要があります**

最初のタブ (ホーム タブ) のスクリーン ショットを取得しました

都市を選択した場所で、TabBar が下にある状態で次の画面に移動し、次に次のビューに移動し、次の画面に移動し、最後のスクリーンショットまで画像を表示します。

しかし、Androidでどうすればいいのかわかりません。

[ホーム] タブにあるすべてのビューに TabBar を表示するにはどうすればよいですか?

これまでのところ、私はこのコードを持っています:

TabView.java

TabHostProvider.java

import android.app.Activity;

  public abstract class TabHostProvider {
public Activity context;

public TabHostProvider(Activity context){
    this.context = context;
}

public abstract TabView getTabHost(String category);
 }

[Tab.java][2]

MyTabHostProvider.java

import android.app.Activity;
import android.content.Intent;
 import android.graphics.Color;
 import android.graphics.drawable.GradientDrawable;

  public class MyTabHostProvider extends TabHostProvider {

private Tab cityTab;
private Tab searchTab;
private Tab mapTab;
private Tab favouriteTab;
private Tab settingTab;

private TabView tabView;
private GradientDrawable gradientDrawable, transGradientDrawable;

public MyTabHostProvider(Activity context) {
    super(context);
    // TODO Auto-generated constructor stub
}

@Override
public TabView getTabHost(String category) {
    // TODO Auto-generated method stub
    tabView = new TabView(context);
    tabView.setOrientation(TabView.Orientation.BOTTOM);
  tabView.setBackgroundID(R.drawable.tab_background_gradient);

    gradientDrawable = new GradientDrawable(
            GradientDrawable.Orientation.TOP_BOTTOM,
            new int[] {0xFFB2DA1D, 0xFF85A315});
    gradientDrawable.setCornerRadius(0f);
    gradientDrawable.setDither(true);

    transGradientDrawable = new GradientDrawable(
            GradientDrawable.Orientation.TOP_BOTTOM,
            new int[] {0x00000000, 0x00000000});
    transGradientDrawable.setCornerRadius(0f);
    transGradientDrawable.setDither(true);

    cityTab = new Tab(context, category);
    cityTab.setIcon(R.drawable.navbar_allnormal);
    cityTab.setIconSelected(R.drawable.navbar_allselected);
    cityTab.setBtnText("City");
    cityTab.setBtnTextColor(Color.WHITE);
    cityTab.setSelectedBtnTextColor(Color.BLACK);

    cityTab.setBtnGradient(transGradientDrawable);
    cityTab.setSelectedBtnGradient(gradientDrawable);
    cityTab.setIntent(new Intent(context, CityActivity.class));

    searchTab = new Tab(context, category);
    searchTab.setIcon(R.drawable.navbar_picturenormal);
    searchTab.setIconSelected(R.drawable.navbar_pictureselected);
    searchTab.setBtnText("Search");
    searchTab.setBtnTextColor(Color.WHITE);
    searchTab.setSelectedBtnTextColor(Color.BLACK);

    searchTab.setBtnGradient(transGradientDrawable);
    searchTab.setSelectedBtnGradient(gradientDrawable);
    searchTab.setIntent(new Intent(context, SearchActivity.class));

    mapTab = new Tab(context, category);
    mapTab.setIcon(R.drawable.navbar_filenormal);
    mapTab.setIconSelected(R.drawable.navbar_fileselected);
    mapTab.setBtnText("Map");
    mapTab.setBtnTextColor(Color.WHITE);
    mapTab.setSelectedBtnTextColor(Color.BLACK);

    mapTab.setBtnGradient(transGradientDrawable);
    mapTab.setSelectedBtnGradient(gradientDrawable);
    mapTab.setIntent(new Intent(context, MapFragment.class));

    favouriteTab = new Tab(context, category);
    favouriteTab.setIcon(R.drawable.navbar_videonormal);
    favouriteTab.setIconSelected(R.drawable.navbar_videoselected);
    favouriteTab.setBtnText("Favourites");
    favouriteTab.setBtnTextColor(Color.WHITE);
    favouriteTab.setSelectedBtnTextColor(Color.BLACK);

    favouriteTab.setBtnGradient(transGradientDrawable);
    favouriteTab.setSelectedBtnGradient(gradientDrawable);
    favouriteTab.setIntent(new Intent(context, FavouritesActivity.class));

    settingTab = new Tab(context, category);
    settingTab.setIcon(R.drawable.navbar_morenormal);
    settingTab.setIconSelected(R.drawable.navbar_moreselected);
    settingTab.setBtnText("Settings");
    settingTab.setBtnTextColor(Color.WHITE);
    settingTab.setSelectedBtnTextColor(Color.BLACK);

    settingTab.setBtnGradient(transGradientDrawable);
    settingTab.setSelectedBtnGradient(gradientDrawable);
    settingTab.setIntent(new Intent(context, SettingsActivity.class));

    tabView.addTab(cityTab);
    tabView.addTab(searchTab);
    tabView.addTab(mapTab);
    tabView.addTab(favouriteTab);
    tabView.addTab(settingTab);

    return tabView;
}

    }

CityActivity.java

public class CityActivity extends Activity {

private final String TAG = CityActivity.class.getSimpleName();
private ListView moreList = null;
private final String[] moreItems = { "Srinagar", "Gulmarg", "Pehlgam", "Jammu", "Leh",
        "Patnitop"};

private TextView tv;
private Button action_button;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TabHostProvider tabProvider = new MyTabHostProvider(CityActivity.this);
    TabView tabView = tabProvider.getTabHost("City");
    tabView.setCurrentView(R.layout.city);
    setContentView(tabView.render(0));

    moreList = (ListView) findViewById(R.id.moreactivity_list);
    moreList.setAdapter(new MoreCityAdapter(CityActivity.this, moreItems));
    moreList.setOnItemClickListener(new OnItemClickListener() 
    {

        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            final String activity = moreList.getAdapter().getItem(position).toString().trim();
            Log.d(TAG, "Clicked Item: " + activity);
            tv = (TextView)findViewById(R.id.tv_header_title);
            tv.setText(activity);
              Intent intent = new Intent(CityActivity.this, Second.class);
                startActivity(intent);


    }
});
 }

Second.java

  public class Second extends Activity{

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

        Here i need to show the Tab bar with my List View
       How should i get the Tab Bar here and on my following Third,Fourth & Fifth Activity

}
   }

[MoreCityAdapter.java][3]

都市を選択

場所を選択

完全な写真

4

6 に答える 6

3

このプロジェクト /link をコードに実装してみてください。私はそれがあなたのために働くと思います..Activity Groupをプロジェクト/コードに実装するだけで、必要に応じてタブで動作します.:)

于 2013-05-08T07:53:07.293 に答える
1

この種の相互作用をAndroidアプリに統合する方法をいくつか提案したいと思います.

  1. 最初に、すべての「タブ」を追加し、ユーザーの選択に応じてそれらを追加/削除してLIST_NAVIGATION使用できる ActionBar で使用できます。Fragments2.2 以降の古い Android バージョンをサポートする場合は、古いバージョンの APIActionBarSherlockの非常に優れた実装であるを使用できます。ActionBarAndroid 用 Gmail アプリの ActionBar でのリスト ナビゲーションの例と、これを実現する方法の例は、ActionBarSherlock にあります

  2. このようなことを達成するために使用できる 2 番目の方法は、Google+、Youtube、Facebook アプリのような SlidingDrawer を使用することです。これも私の意見では良いオプションです。このSlidingMenuには優れたライブラリがあります。

それは、あなたが望むものを達成するための最良の方法だとあなたが考える方法に依存します. 最後に、IOS のようなタブを本当に使いたい場合は、次のようにすることをお勧めします。

activity_main.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">

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0"/>

        <FrameLayout
            android:id="@+android:id/realtabcontent"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>

        <TabWidget
            android:id="@android:id/tabs"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"/>

    </LinearLayout>
</TabHost>

MainTabActivity :

public class MainActivity extends SherlockFragmentActivity {

private TabHost mTabHost;
private TabManager mTabManager;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mTabHost = (TabHost) findViewById(android.R.id.tabhost);
    mTabHost.setup();

    mTabManager = new TabManager(this, mTabHost, R.id.realtabcontent);


    TabHost.TabSpec spec = mTabHost.newTabSpec("collections");
    View tabIndicator = LayoutInflater.from(this).inflate(R.layout.tab_layout, mTabHost.getTabWidget(), false);
    TextView title = (TextView) tabIndicator.findViewById(R.id.title); // tab title
    title.setText(getString(R.string.collection_tab));
    ImageView icon = (ImageView) tabIndicator.findViewById(R.id.icon);  // tab icon
    icon.setImageResource(R.drawable.ic_tab_collections);
    spec.setIndicator(tabIndicator);
    mTabManager.addTab(spec, MyCollectionList.class, null); // WHERE MyCollectionList is Fragment attached to first tab.

    // MYLIST TAB
    TabHost.TabSpec spec5 = mTabHost.newTabSpec("mylist");
    View tabIndicator5 = LayoutInflater.from(this).inflate(R.layout.tab_layout, mTabHost.getTabWidget(), false); // used for custom design of tab
    TextView title5 = (TextView) tabIndicator5.findViewById(R.id.title); // tab title
    title5.setText(getString(R.string.my_list));
    ImageView icon5 = (ImageView) tabIndicator5.findViewById(R.id.icon); // tab icon
    icon5.setImageResource(R.drawable.ic_tab_mylist);
    spec5.setIndicator(tabIndicator5);
    mTabManager.addTab(spec5, MyList.class, null); // MyList - second Fragment attached to second tab

    // ADD as many tabs as you want


    mTabHost.setCurrentTab(0); // set selected tab

    }

}

およびTabManager.class (これは ActionBarSherlock の例から取得したもので、バージョンを少し変更しています):

import java.util.HashMap;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.widget.TabHost;

/**
 * This is a helper class that implements the management of tabs and all
 * details of connecting a ViewPager with associated TabHost.  It relies on a
 * trick.  Normally a tab host has a simple API for supplying a View or
 * Intent that each tab will show.  This is not sufficient for switching
 * between pages.  So instead we make the content part of the tab host
 * 0dp high (it is not shown) and the TabsAdapter supplies its own dummy
 * view to show as the tab content.  It listens to changes in tabs, and takes
 * care of switch to the correct paged in the ViewPager whenever the selected
 * tab changes.
 */
public class TabManager implements TabHost.OnTabChangeListener {
    private final FragmentActivity mActivity;
    private final TabHost mTabHost;
    private final int mContainerId;
    private int mLastFragmentId;
    private final HashMap<String, TabInfo> mTabs = new HashMap<String, TabInfo>();
    TabInfo mLastTab;

    static final class TabInfo {
        private final String tag;
        private final Class<?> clss;
        private final Bundle args;
        private Fragment fragment;

        TabInfo(String _tag, Class<?> _class, Bundle _args) {
            tag = _tag;
            clss = _class;
            args = _args;
        }
    }

    static class DummyTabFactory implements TabHost.TabContentFactory {
        private final Context mContext;

        public DummyTabFactory(Context context) {
            mContext = context;
        }

        @Override
        public View createTabContent(String tag) {
            View v = new View(mContext);
            v.setMinimumWidth(0);
            v.setMinimumHeight(0);
            return v;
        }
    }

    public TabManager(FragmentActivity activity, TabHost tabHost, int containerId) {
        mActivity = activity;
        mTabHost = tabHost;
        mContainerId = containerId;
        mTabHost.setOnTabChangedListener(this);
    }

    public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) {
        tabSpec.setContent(new DummyTabFactory(mActivity));
        String tag = tabSpec.getTag();

        TabInfo info = new TabInfo(tag, clss, args);

        // Check to see if we already have a fragment for this tab, probably
        // from a previously saved state.  If so, deactivate it, because our
        // initial state is that a tab isn't shown.
        info.fragment = mActivity.getSupportFragmentManager().findFragmentByTag(tag);
        if (info.fragment != null && !info.fragment.isDetached()) {
            FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
            ft.detach(info.fragment);
            ft.commit();
        }

        mTabs.put(tag, info);
        mTabHost.addTab(tabSpec);
    }

    @Override
    public void onTabChanged(String tabId) {
        TabInfo newTab = mTabs.get(tabId);
        if (mLastTab != newTab) {
            FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
            if (mLastTab != null) {
                FragmentManager mManager = mActivity.getSupportFragmentManager();
                if(mManager.getBackStackEntryCount() > 0){
                    mLastFragmentId = mManager.getBackStackEntryAt(0).getId();
                    mManager.popBackStack(mLastFragmentId, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                }
                if (mLastTab.fragment != null) {
                    ft.detach(mLastTab.fragment);
                }
            }
            if (newTab != null) {
                if (newTab.fragment == null) {
                    newTab.fragment = Fragment.instantiate(mActivity,
                            newTab.clss.getName(), newTab.args);
                    ft.add(mContainerId, newTab.fragment, newTab.tag);
                } else {
                    ft.attach(newTab.fragment);
                }
            }

            mLastTab = newTab;
            ft.commit();
            mActivity.getSupportFragmentManager().executePendingTransactions();
        }
        }
    }

この投稿が、あなたが望むものを達成するための最良の方法を見つけるのに役立つことを願っています! : )

于 2013-04-26T10:11:38.977 に答える
0

Like already sugested, I would also recomend using the actionbar not only because the TabBarActivity is deprecated, but also because it is its UI design of Android. And a Android user would want a Android like UI and not an iOS one becuase he or she is not used to this kind of workflow.

If you want legecy platforms support I would recommend this library. http://actionbarsherlock.com/ Many apps use this, including whatsapp foursquare and many more.

For your porpuse, you are looking for the pager, do a google search and you will find lots of info in combo with actionbar sherlock. Or look in the samples provided by Actionbar, they have almost all given scenerios in there samples.

Hope this helps.

于 2013-04-26T09:00:35.650 に答える
0

はい、あなたはそれを行うことができます

TabHost のすべてのタブのスタックを作成することでこれを行い、スタックはすべてのビューを保持し、そのように ActivityGroup を使用しました。

1 - スタック マネージャーを作成する

import java.util.Stack;
import android.app.Activity;
import android.app.ActivityGroup;
import android.app.LocalActivityManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.Window;

@SuppressWarnings("deprecation")
public class FirstStackManager extends ActivityGroup {

        private Stack<String> MY_STACK;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (MY_STACK == null)
            MY_STACK = new Stack<String>();
        // start default activity
        push("FirstActivity", new Intent(this, FirstActivity.class));
    }

    @Override
    public void finishFromChild(Activity child) {
        pop();
    }

    @Override
    public void onBackPressed() {
        pop();
    }

    public void push(String id, Intent intent) {
        Window window = getLocalActivityManager().startActivity(id,
                intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK));
        if (window != null) {
                MY_STACK.push(id);
            setContentView(window.getDecorView());
        }
    }

    public void pop() {
        if (MY_STACK.size() == 1)
            finish();
        LocalActivityManager manager = getLocalActivityManager();
        manager.destroyActivity(MY_STACK.pop(), true);
        if (MY_STACK.size() > 0) {
            Intent lastIntent = manager.getActivity(MY_STACK.peek())
                    .getIntent();
            Window newWindow = manager.startActivity(
                    MY_STACK.peek(), lastIntent);
            setContentView(newWindow.getDecorView());
        }
    }
}

マニフェスト ファイルに FirstStackManager を追加することを忘れないでください

2 - あなたの主な活動では、そのようなスタックを使用してください

@SuppressWarnings("deprecation")
public class MainActivity extends TabActivity {

        TabHost tabHost;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
                setContentView(R.layout.tab);


            tabHost = getTabHost();
        setTabs();
    }

    private void setTabs() {
        addTab("FirstTab", R.drawable.tab_first, FirstStackManager.class);
        addTab("SecondTab", R.drawable.tab_second, SecondStackManager.class);
                /*Other tab*/
    }

    private void addTab(String labelId, int drawableId, Class<?> c) {
        Intent intent = new Intent().setClass(this, c);
        TabHost.TabSpec spec = tabHost.newTabSpec("tab" + labelId);

        View tabIndicator = LayoutInflater.from(this).inflate(
                R.layout.tab_indicator, getTabWidget(), false);
        ImageView icon = (ImageView) tabIndicator.findViewById(R.id.icon);
        icon.setImageResource(drawableId);
        spec.setIndicator(tabIndicator);
        spec.setContent(intent);
        tabHost.addTab(spec);
    }

ここでxmlsファイルを作成する方法を見つけることができますRaised-Center-Tab-in-Android

3 - FirstActivity で、そのような新しいビューをプッシュします

public class FirstActivity extends Activity{

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

      /*push a view on list click listeneer*/

       Intent intent = new Intent();
       intent.setClass(FirstActivity.this, DetailActivity.class);
       FirstStackManager activityStack = (FirstStackManager) getParent();
       activityStack.push("DetailActivity", intent); 

}
   }

4 - そのような DetailActivity ポップ ビューで

public class DetailActivity extends Activity{

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

      /*pop a view on back button click listeneer*/

       FirstStackManager activityStack = (FirstStackManager) getParent();
       activityStack.pop(); 

}
   }
于 2013-04-26T10:15:51.967 に答える
0

Android Design Pattern でその目的のために設計された ActionBar を使用することをお勧めします。- TabBarActivity は非推奨 http://developer.android.com/reference/android/app/TabActivity.html

詳細はこちら: http://www.androiduipatterns.com/2011/12/how-should-android-apps-look-like_16.html

于 2013-04-26T08:49:56.910 に答える