2011-08-18 4 views
7

私のアプリケーションのTabActivityを、Android互換パッケージv4を使用したフラグメントベースのデザインに置き換えようとしています。Android互換APIのPreferenceFragmentの代替手段ですか?

私が抱えている問題は、TabActivityのタブの1つがPreferencesActivityであったことです.PragmentActivityから明示的に起動できません。

PreferenceFragmentがAndroid互換パッケージに含まれていないため、私のフラグメントアクティビティからPreferenceActivityを起動できないため、どうすればよいですか?

提案があります。そのほとんどは、 'の互換パッケージv4の例から取られた(

FATAL EXCEPTION: main 
java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'? 
    at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:652) 
    at android.widget.TabHost.setCurrentTab(TabHost.java:326) 
    at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:132) 
    at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:456) 
    at android.view.View.performClick(View.java:2485) 
    at android.view.View$PerformClick.run(View.java:9080) 
    at android.os.Handler.handleCallback(Handler.java:587) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:130) 
    at android.app.ActivityThread.main(ActivityThread.java:3683) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
    at dalvik.system.NativeStart.main(Native Method) 

そして、私のFragmentActivityコードは次のとおりです。

EDIT:私のフラグメント活動からPreferenceActivityを開こうとしたときに私が得る例外はこちらタブ):

EDIT2:また追加のサンプルコード、明確化のために:

import java.util.HashMap; 

import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.Environment; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentTransaction; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.TabHost; 
import android.widget.TextView; 

public class PlayerTabActivity extends FragmentActivity { 
    private static final String TAG = PlayerTabActivity.class.getSimpleName(); 
    TabHost mTabHost; 
    TabManager mTabManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

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

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

     //this is my fragment 
     mTabManager.addTab(mTabHost.newTabSpec("player").setIndicator(createTabView(this, "Player")), 
       PlayerMainFragment.class, null); 

     //this is my activity 
     mTabHost.addTab(mTabHost.newTabSpec("settings").setIndicator(createTabView(this, "Settings")) 
       .setContent(new Intent(this, PlayerSettingsActivity.class))); 

     if (savedInstanceState != null) { 
      mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); 
     } 
    } 

    //make the tab look pretty 
    private static View createTabView(Context context, String tag) { 
     View view = LayoutInflater.from(context).inflate(R.layout.tabs_bg, null); 
     TextView tv = (TextView) view.findViewById(R.id.tab_text); 
     tv.setText(tag); 
     return view; 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putString("tab", mTabHost.getCurrentTabTag()); 
    } 

    /** 
    * This is a helper class that implements a generic mechanism for 
    * associating fragments with the tabs in a tab host. 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 
    * fragments. So instead we make the content part of the tab host 0dp high 
    * (it is not shown) and the TabManager 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 fragment shown in a separate content area whenever 
    * the selected tab changes. 
    */ 
    public static class TabManager implements TabHost.OnTabChangeListener { 
     private final FragmentActivity mActivity; 
     private final TabHost mTabHost; 
     private final int mContainerId; 
     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) { 
        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(); 
      } 
     } 
    } 
} 

答えて

1

PreferenceFragmentCompatを導入したv7 support librarylatest revisionを参照してください。

+0

この質問とリンクされた質問(重複する質問のコメント)に答える代わりに、リンクされた質問の複製としてこの質問を閉じるよう投票する必要があります。 @ArtjomB。 –

+0

こんにちはArtjom。私は本当に答えたときに閉じるために投票しました。実際には、リンクされた質問の複製である合計3つの質問(これを含む)があります。私は3つすべてを締結することにしました。 – theblang