2012-05-29 3 views
22

내 허니 콤 및 태블릿 크기의 ICS에서 환경 설정 화면이 깨지지 않도록 내 앱에 환경 설정 헤더를 추가했습니다. 그러나 현재는 한 개의 헤더 만 가지고 있으므로 전화 크기의 장치에서 하나의 항목으로 헤더 화면을 클릭해야합니다. 헤더가 하나 밖에 없을 때 헤더 화면을 건너 뛰기 위해 안드로이드에게 쉽게 알리는 방법이 있겠지만 큰 화면에 계속 표시하려면 어떻게해야합니까?하나의 헤더가있을 때 PreferenceActivity에서 헤더 건너 뛰기

주식 연락처 앱이 성공적으로 처리하지만 해당 기기의 source을 탐색했으며 어떻게 처리하는지 알 수 없습니다.

+0

가 기본 PreferenceFragment가 설정 활동이 @ jdr88에 의해 주어진 동일한 기술을 사용하여, 메뉴에서 시작할 때 지정됩니다. 자세한 정보는 [settingsAreMultiPane]에 대해서는 [here] (https://github.com/android/platform_packages_apps_contacts/blob/master/src/com/android/contacts/activities/PeopleActivity.java)와 Ctrl-F –

답변

54

PreferenceFragments 중 하나를 기본값으로 설정하여 헤더를 건너 뛸 수 있습니다. 당신이 PreferenceActivity.java 소스를 살펴 때

,이 두 엑스트라를 찾을 수 있습니다 :

/** 
* When starting this activity, the invoking Intent can contain this extra 
* string to specify which fragment should be initially displayed. 
*/ 
public static final String EXTRA_SHOW_FRAGMENT = ":android:show_fragment"; 

/** 
* When starting this activity, the invoking Intent can contain this extra 
* boolean that the header list should not be displayed. This is most often 
* used in conjunction with {@link #EXTRA_SHOW_FRAGMENT} to launch 
* the activity to display a specific fragment that the user has navigated 
* to. 
*/ 
public static final String EXTRA_NO_HEADERS = ":android:no_headers"; 

이제 간단하게 표시해야 PreferenceFragment 당신의 PrefenceActivity를 호출하는 의도로이 두 엑스트라를 추가 지정 기본적으로 다음과 같이

Intent intent = new Intent(this, Preferences.class); 
intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, PreferencesFragment.class.getName()); 
intent.putExtra(PreferenceActivity.EXTRA_NO_HEADERS, true); 
+3

을 클릭하십시오. 나는 찾고 있었다! 감사. EXTRA_SHOW_FRAGMENT를 사용하는 것만으로도 헤더가 여전히 태블릿에 표시되지만 휴대 전화의 설정 조각으로 곧바로 이동한다는 것을 알았습니다. 이는 정확히 내가 원했던 것입니다. –

+0

"PreferenceFragments 중 하나를 기본값으로 설정"하는 것이 무슨 뜻인지 분명히 할 수 있습니까? 내 버전은 아래 있습니다. XML에서 기본값을 지정하는 다른 방법을 찾지 못했습니다. XML 파싱 소스를 확인했습니다. – Anm

+0

Spot on answer! – feresr

1

머리글을 특별히 건너 뛸 수 있는지 여부는 알 수 없지만 이것이 내가 한 것입니다.

두 개의 클래스를 만들었습니다. 하나는 Extra Large 화면 크기 용이고 나머지 하나는 나머지 클래스 용입니다. EditPreferences.class는 내 정상 preferences.xml을로드하고 EditPreferencesXLarge.class는 기본 설정 헤더 xml을로드합니다.

public boolean onOptionsItemSelected(MenuItem item) { 
    final int SCREENLAYOUT_SIZE_XLARGE = 4; 
    final int HONEYCOMB = 11; 
    int screenSize = getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK; 

    switch(item.getItemId()) 
    { 
     case R.id.item_prefs: 
      if (Build.VERSION.SDK_INT < HONEYCOMB) { 
       startActivity(new Intent(this, EditPreferences.class)); 
      } 
      else if (screenSize < SCREENLAYOUT_SIZE_XLARGE) { 
       startActivity(new Intent(this, EditPreferences.class)); 
      } 
      else { 
       startActivity(new Intent(this, EditPreferencesXLarge.class)); 
      } 

      return true; 
    } 

    return (super.onOptionsItemSelected(item)); 
} 
4

jenzz에 의해 언급 된 EXTRA_SHOW_FRAGMENT을 활용, 당신과 같이, 활동의 의도를 조작 할 수 있습니다 :

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // By default, show MainPreferences 
    Intent intent = getIntent(); 
    if (intent.getStringArrayExtra(EXTRA_SHOW_FRAGMENT) == null) { 
    getIntent().putExtra(EXTRA_SHOW_FRAGMENT, MainPreferences.class.getName()); 
    } 

    super.onCreate(savedInstanceState); 
} 
1

활동에서이 코드를 제거 할 수 있습니다.

 public void onBuildHeaders(List<Header> target) { 
     loadHeadersFromResource(R.xml.pref_general, target); 
    } 

그리고 당신의 조각 교체 : 연락처 응용 프로그램에서

public class SettingsActivity extends AppCompatPreferenceActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
      getFragmentManager().beginTransaction().replace(android.R.id.content, 
       new GeneralPreferenceFragment()).commit(); 

    } 

    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    public static class GeneralPreferenceFragment extends PreferenceFragment { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.pref_general); 

     } 

    } 

}