25

HoneycombやタブレットサイズのICSで設定画面が壊れて見えないように、アプリに設定ヘッダーを追加しました。ただし、現時点ではヘッダーが1つしかないため、電話サイズのデバイスでは、エントリが1つしかないヘッダー画面をクリックする必要があります。ヘッダーが1つしかない場合にヘッダー画面をスキップするようにAndroidに指示する簡単な方法はありますが、それでも大画面に表示することはできますか?

株式の連絡先アプリはこれを正常に実行しているようですが、ソースを参照したところ、どのように実行されているのかわかりません。

4

4 に答える 4

61

PreferenceFragmentsの1つをデフォルトとして設定することにより、ヘッダーをスキップできます。

PreferenceActivity.javaソースを見ると、次の2つの追加機能があります。

/**
 * 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";

次に、これら2つのエクストラを、PrefenceActivityを呼び出すインテントに追加し、デフォルトで次のように表示されるPreferenceFragmentを指定します。

Intent intent = new Intent( this, Preferences.class );
intent.putExtra( PreferenceActivity.EXTRA_SHOW_FRAGMENT, PreferencesFragment.class.getName() );
intent.putExtra( PreferenceActivity.EXTRA_NO_HEADERS, true );
于 2012-06-09T11:45:12.327 に答える
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);
}
于 2014-02-12T04:55:35.223 に答える
3

アクティビティでこのコードを削除できます。

     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);

        }

    }

}
于 2017-02-07T16:27:20.523 に答える
1

具体的にヘッダーをスキップできるかどうかはわかりませんが、これは私がやったことです。

2つのクラスを作成しました。1つは特大画面サイズ用で、もう1つは残りのクラス用です。EditPreferences.classは私の通常のpreferences.xmlをロードし、EditPreferencesXLarge.classはpreference-headersxmlをロードします。

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));
}
于 2012-06-07T14:51:51.843 に答える