17

私は minSdkVersion="11" でアプリを開発しています。これは、タブレットと Android 4.0 以降のアプリです。このトピックについてインターネットを精査しましたが、あまり見つかりませんでした。

以前のバージョンの Android SDK のカスタム レイアウトを実装するには、ListView とその id が android.R.id.list に等しいレイアウト (たとえば、preference.xml) を作成し、setContentView メソッドを使用するだけです。

プリファレンス.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" > 
    <ListView android:id="@android:id/list"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent" /> 
</RelativeLayout>

Android 3.0 では状況が変わり、設定はフラグメントを使用して実装されます。それが私のpreference_headers.xmlファイルがどのように見えるかです:

<preference-headers
        xmlns:android="http://schemas.android.com/apk/res/android">

    <header android:fragment="com.example.MyPreferenceActivity$GeneralSettingsFragment" 
            android:title="General"
            android:summary="Common settings." />
    <header  
            android:title="Example.com" >
        <intent android:action="android.intent.action.VIEW"
                android:data="http://www.example.com" />
    </header> 

</preference-headers>

MyPreferenceActivity.java:

public class MyPreferenceActivity extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.preference);
        // Add a button to the header list.
        if (hasHeaders()) {
            Button button = new Button(this); 
            button.setText("Log out");
            setListFooter(button);

        }

    }


    /**
     * Populate the activity with the top-level headers.
     */
    @Override
    public void onBuildHeaders(List<Header> target) {
        loadHeadersFromResource(R.xml.preference_headers, target);
    }

    public static class GeneralSettingsFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.fragmented_preferences);

        }
    }
}

ここで MyPreferenceActivity を実行すると、LogCat に次のエラーが表示されます。

> java.lang.IllegalArgumentException: No view found for id 0x10202be for
> fragment GeneralSettingsFragment{4077f8c0 #0 id=0x10202be}
> E/AndroidRuntime(17103): at
> android.app.FragmentManagerImpl.moveToState(FragmentManager.java:729)
> E/AndroidRuntime(17103): at
> android.app.FragmentManagerImpl.moveToState(FragmentManager.java:926)
> E/AndroidRuntime(17103): at
> android.app.FragmentManagerImpl.moveToState(FragmentManager.java:909)
> E/AndroidRuntime(17103): at
> android.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1584)
> E/AndroidRuntime(17103): at
> android.app.Activity.performStart(Activity.java:4377)
> E/AndroidRuntime(17103): at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1724)
> E/AndroidRuntime(17103):  ... 11 more

この問題の原因はわかっています。FragmentManager は、フラグメント GeneralSettingsFragment を挿入するビューを見つけることができません。しかし、それを解決する方法がわかりません。

ちなみに、Android 4.0 で同じアプリを実行すると、最初の Preference アクティビティがヘッダー付きで表示されます。しかし、一般をクリックすると、アプリがクラッシュし、LogCat で同様のエラーが表示されます。

java.lang.IllegalArgumentException: No view found for id 0x10202cd for fragment GeneralSettingsFragment{4134b4e0 #0 id=0x10202cd}
E/AndroidRuntime(2170):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:789)
E/AndroidRuntime(2170):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:998)
E/AndroidRuntime(2170):     at android.app.BackStackRecord.run(BackStackRecord.java:622)
E/AndroidRuntime(2170):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1330)
E/AndroidRuntime(2170):     at android.app.Activity.performStart(Activity.java:4474)
E/AndroidRuntime(2170):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1928)
4

3 に答える 3

4

私はあなたと同じ問題を抱えていました。

私は多くのことを試しましたが、ここに私の完全なコードがあります:

https://github.com/iRail/BeTrains-for-Android/blob/master/src/tof/cv/mpp/MyPreferenceActivity.java

トリックは onBuildHeaders セクションに setContentView を追加することですが、onCreate には追加しません。

また、フラグメントでいくつかのテストを行いましたが、これが機能する理由は完全にはわかりませんが、約束します: タブレットのヘッダー セクションにカスタム レイアウトがあります!

https://github.com/iRail/BeTrains-for-Android/blob/master/src/tof/cv/mpp/view/StockPreferenceFragment.java

于 2012-01-26T09:59:34.403 に答える
2

私は私のアプリケーションのためにこのコードを試しました

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="@string/PreferencesActivity.GeneralSettingsCategoryTitle">
        <Preference
            android:title="yor title"
            android:summary="your summary"
            android:key="key to access preference" />       
        <Preference
            android:title="@string/"
            android:summary="@string/"
            android:key="key2" />
        <PreferenceScreen
            android:key="key3"
            android:title="@string/"
            android:summary="@string/">
            <CheckBoxPreference
                android:title="@string/"
                android:defaultValue="false"
                android:summary="@string/"
                android:key="key4" />
            <CheckBoxPreference
                android:title="@string/"
                android:defaultValue="true"
                android:summary="@string/"
                android:key="key5" />

            <ListPreference
                android:title="@string/"
                android:summary="@string/"
                android:key="key6"
                android:defaultValue="buttons"
                android:entries="@array/"
                android:entryValues="@array/" />
            ....


                </prefefenceScreen>
      </preferenceCategory>
</preferenceScreen>



enter code here
于 2011-12-22T08:22:54.573 に答える
-1

setContenViewは必要ありません。この例の場合、レイアウトの入力はヘッダーと関連するフラグメントを介して行われ、別の単語が自動的に行われます。

于 2011-10-23T04:29:55.407 に答える