2013-04-06 2 views
10

FragmentPagerAdapterPreferenceFragment을 추가하려고합니다.FragmentPagerAdapter에 PreferenceFragment 추가

내 수업은 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 나를 보너스 froid를 사용하는 FragmentPagerAdapter가 포함 된 v13 지원 라이브러리를 사용하여 해결했습니다. 그러면, PreferenceFragment를 지원할 수 있습니다.

    :

    이클립스를 사용하고 (당신에게 V4 호출기 상용구를 제공합니다)은 "스크롤 탭 + 출근"탐색과 새로운 응용 프로그램 마법사를 실행 가정, 여기 당신이 V13로 업그레이드하기 위해 필요한 수정은

  • libs 폴더에서 "android-support-v4.jar"파일을 삭제하십시오.
  • "android-support-v13.항아리 "SDK_PATH에서 \ 엑스트라 안드로이드 \ 지원 \의 V13 \ 그것은이 아니라면, 설치 또는 업데이트하는 SDK 관리자를 사용하여"자바 파일에서

그런 다음 "엑스트라/안드로이드 지원 라이브러리 :

    일반 활동
  • 변경 v13와
  • 변경 FragmentActivity에 V4에서
  • 변경 FragmentPagerAdapter 가져 오기 android.app 대신 안드로이드에서 getFragmentManager에
  • 가져 오기 필요한 모든 클래스에서 getSupportFragmentManager 호출. support.v4
  • (제외 : 당신은 여전히 ​​V4의 ViewPager를 사용해야하지만 호환)

내가 수정 된 소스 아래에 복사, 최신 젤리 빈에 대한 확인했습니다.

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

감사합니다. 나는 당신의 문제의 근원에 도달하는 유사한 질문 [here] (http://stackoverflow.com/a/11787090/279175)을 보았다; v4 호출기는 android.app.Fragment를 지원하지 않지만, PreferenceFragment가 파생되지 않은 버전의 v4 버전을 지원합니다. – PseudoNoise

+0

그래,이 질문을 게시 한 지 며칠 후 알았다. 질문을 삭제하려고했지만 해상도가 효과가있는 것으로 보입니다. – jnthnjns

0

Documentation

나는 당신이 조각 트랜잭션에 대한 컨테이너보기 ID를 지정해야합니다 생각합니다. ViewPager의 ID를 입력 해보십시오. 또는 ViewPager를 다른 컨테이너에 넣고 id를 부여한 다음 사용하십시오.

관련 문제