2013-04-06 3 views
10

FragmentPagerAdapterPreferenceFragmentを追加しようとしています。PreferenceFragmentをFragmentPagerAdapterに追加する

私のクラスはFragmentActivityまで伸びていますが、私はFragmentTransactionを試してみましたが、以下に示すようにコンテナに追加しようとしていて何もできないようです。 いいえエラーがスローされますが、実際には何も起こりません。

主な活動:

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

    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 
    mViewPager = (ViewPager) findViewById(R.id.pager); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 
} 

activity_main.xml:

<android.support.v4.view.ViewPager 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" > 
</android.support.v4.view.ViewPager> 

[オプション]メニューの選択:

android.app.FragmentManager fm; 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.menu_settings: 
     JJSettings settings = new JJSettings(); 
     fm = getFragmentManager(); 
     FragmentTransaction fragTrans = fm.beginTransaction(); 
     // I also tried `replace()` here as well. Same 'nothing happens' result. 
     fragTrans.add(settings, "settings"); 
     fragTrans.commit(); 
     return true; 
    case R.id.menu_help: 
     menuHelp(); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

マイ設定Fragment

public class JJSettings extends PreferenceFragment { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.settings); 
    } 
} 

すべてであれば私の好みは、私はむしろPreferenceActivityを拡張したりPreferenceFragmentを呼び出し、別のアクティビティにユーザーを取らないだろうという意味、可能であればFragmentsに固執するだろう可能。私は私の研究で何かを逃したいと思っています。


編集

public class SectionsPagerAdapter extends FragmentPagerAdapter { 
    private int _count = 2; 

    public SectionsPagerAdapter(FragmentManager fm) { super(fm); } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     return super.instantiateItem(container, position); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
     case 0: 
      return new JJMainFragment(); 
     case 1: 
      return new JJPendingFragment(); 
     default: 
      return null; 
     } 
    } 

    public void setCount(int count) { this._count = count; } 

    @Override 
    public int getCount() { return this._count; } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     switch (position) { 
     case 0: 
      return getString(R.string.c_list).toUpperCase(Locale.ENGLISH); 
     case 1: 
      return getString(R.string.c_pending).toUpperCase(Locale.ENGLISH); 
     } 
     return null; 
    } 
} 
+0

あなたSectionsPagerAdapterコードを投稿することができますか? – Karakuri

+0

@ Karakuri追加、なぜあなたがそれを見たかったのか100%確信していないので、私は設定/好みを 'ViewPager'に追加したくありません。 – jnthnjns

答えて

30

This answer私には、本物のandroid.app.Fragmentsを使用するFragmentPagerAdapterを含むv13サポートライブラリを使用したソリューションに導いたので、PreferenceFragmentをサポートできます。

    Eclipseを使用して(あなたのv4のページャの定型を与える)「スクロール可能なタブ+スワイプ」ナビゲーションを使用して新しいアプリケーションウィザードを実行すると仮定すると、ここにあなたがV13にアップグレードするようにする必要があり変更があります

  • あなたのlibsフォルダから "android-support-v4.jar"ファイルを削除してください
  • コピー "android-support-v13。瓶」SDK_PATHから\エキストラアンドロイド\サポートの\ V13 \;それはそこにない場合は、インストールまたは更新するSDKマネージャを使用して、 "Javaファイルで、

次に" エクストラ/ Androidのサポートライブラリ:

    プレーンな活動への
  • V13にV4変更FragmentActivityから
  • 変更FragmentPagerAdapterインポート
  • 変更が必要なすべてのandroid.appからのクラスの代わりに、アンドロイドのインポート
  • getFragmentManager
  • にgetSupportFragmentManagerに呼び出します。 support.v4
  • (除いて:あなたはまだV4のViewPagerを使用する必要があるが、それは互換性のある)

私は、最新のJellybeanに検証し、以下の修正されたソースをコピーしました。

MainActivity.java:

package com.example.pagerwithpreferencesfragment; 

import java.util.Locale; 

import android.app.Activity; 
import android.app.Fragment; 
import android.app.FragmentManager; 
import android.os.Bundle; 
import android.preference.PreferenceFragment; 
import android.support.v13.app.FragmentPagerAdapter; // instead of v4.app... 
import android.support.v4.view.ViewPager; 
import android.view.Gravity; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class MainActivity extends Activity { // no longer FragmentActivity 

    // these comments are now out-of-date; v13, not v4 
    /** 
    * The {@link android.support.v4.view.PagerAdapter} that will provide 
    * fragments for each of the sections. We use a 
    * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which 
    * will keep every loaded fragment in memory. If this becomes too memory 
    * intensive, it may be best to switch to a 
    * {@link android.support.v4.app.FragmentStatePagerAdapter}. 
    */ 
    SectionsPagerAdapter mSectionsPagerAdapter; 

    /** 
    * The {@link ViewPager} that will host the section contents. 
    */ 
    ViewPager mViewPager; 

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

     // Create the adapter that will return a fragment for each of the three 
     // primary sections of the app. 
     mSectionsPagerAdapter = new SectionsPagerAdapter(
       getFragmentManager()); // instead of getSupportFragmentMangager 

     // Set up the ViewPager with the sections adapter. 
     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    /** 
    * A {@link FragmentPagerAdapter} that returns a fragment corresponding to 
    * one of the sections/tabs/pages. 
    */ 
    public class SectionsPagerAdapter extends FragmentPagerAdapter { 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      // this is just to show it compiles 
      if (position == 0) { 
       // you should really make this a public class elsewhere.. 
       return new PreferenceFragment() { 
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         addPreferencesFromResource(R.xml.settings_preferences); 
        } 
       }; 
      } 
      // getItem is called to instantiate the fragment for the given page. 
      // Return a DummySectionFragment (defined as a static inner class 
      // below) with the page number as its lone argument. 
      Fragment fragment = new DummySectionFragment(); 
      Bundle args = new Bundle(); 
      args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1); 
      fragment.setArguments(args); 
      return fragment; 
     } 

     @Override 
     public int getCount() { 
      // Show 3 total pages. 
      return 3; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      Locale l = Locale.getDefault(); 
      switch (position) { 
      case 0: 
       return getString(R.string.title_section1).toUpperCase(l); 
      case 1: 
       return getString(R.string.title_section2).toUpperCase(l); 
      case 2: 
       return getString(R.string.title_section3).toUpperCase(l); 
      } 
      return null; 
     } 
    } 

    /** 
    * A dummy fragment representing a section of the app, but that simply 
    * displays dummy text. 
    */ 
    public static class DummySectionFragment extends Fragment { 
     /** 
     * The fragment argument representing the section number for this 
     * fragment. 
     */ 
     public static final String ARG_SECTION_NUMBER = "section_number"; 

     public DummySectionFragment() { 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment_main_dummy, 
        container, false); 
      TextView dummyTextView = (TextView) rootView 
        .findViewById(R.id.section_label); 
      dummyTextView.setText(Integer.toString(getArguments().getInt(
        ARG_SECTION_NUMBER))); 
      return rootView; 
     } 
    } 

} 

settings_preferences.xml:

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

<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <PreferenceCategory 
     android:key="my_category_key" 
     android:title="My Title"> 

     <CheckBoxPreference 
     android:key="pref_key" 
     android:title="Title" 
     android:summary="Summary" 
     android:defaultValue="false" 
     /> 

    </PreferenceCategory> 

</PreferenceScreen> 

enter image description here

+0

これは非常に面白いです、私はそれを調べて、あなたに戻ってきます。プレゼンテーション、ドキュメント、および指示のための+1。すべてがうまくいくなら、私はあなたの答えを受け入れます。ありがとう。 – jnthnjns

+1

ありがとうございます。私はあなたの問題の根源になる同様の質問[ここ](http://stackoverflow.com/a/11787090/279175)を見ました。 v4ページャはandroid.app.Fragmentをサポートしていませんが、PreferenceFragmentが派生していないv4バージョンです。 – PseudoNoise

+0

うん、私はこの質問を投稿してから数日後にそれを見つけました。私はその質問を削除しようとしていましたが、あなたの解決策が働くようです。 – jnthnjns

0

Documentation

私は、あなたがフラグメントトランザクションのコンテナビューIDを指定する必要があると思います。あなたのViewPagerのIDを与えてみてください。または、ViewPagerを別のコンテナに配置し、IDを与えて、それを使用します。

関連する問題