2016-11-07 9 views
0

私の問題を説明する前に、同じエラーhereに関連する同様の質問が表示されました。しかし、それは助けに見えません。原因:java.lang.UnsupportedOperationException:addView(View)がAdapterViewでサポートされていません

メニューで[設定]を押したときに呼び出されるSettingsActivityがあります。ここで

public class SettingsActivity extends AppCompatActivity{ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Log.v("Settings:OnCreate","Going to set View in SettingsActivity"); 
     setContentView(R.layout.activity_settings); 
     Log.v("Settings:OnCreate","View is set in SettingsActivity"); 

     //When I don't add the below part, activity_settings is displayed properly. 
     //I am getting the error when this below part is added 
     if(savedInstanceState == null) { 
      getFragmentManager().beginTransaction() 
        .replace(R.id.activity_settings, new MyPreferenceFragment()) 
        .commit(); 
     } 
    } 



    public static class MyPreferenceFragment extends PreferenceFragment implements Preference.OnPreferenceChangeListener{ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.v("Fragment:OnCreate","Going to add preferences"); 
     addPreferencesFromResource(R.xml.pref_general); 
     bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_location_key))); 
     Log.v("Fragment:OnCreate","Added preferences"); 
    } 

    private void bindPreferenceSummaryToValue(Preference preference) { 
     // Set the listener to watch for value changes. 
     preference.setOnPreferenceChangeListener(this); 

     // Trigger the listener immediately with the preference's 
     // current value. 
     onPreferenceChange(preference, 
       PreferenceManager 
         .getDefaultSharedPreferences(preference.getContext()) 
         .getString(preference.getKey(), "")); 
    } 

    @Override 
    public boolean onPreferenceChange(Preference preference, Object value) { 
     String stringValue = value.toString(); 

     if (preference instanceof ListPreference) { 
      // For list preferences, look up the correct display value in 
      // the preference's 'entries' list (since they have separate labels/values). 
      ListPreference listPreference = (ListPreference) preference; 
      int prefIndex = listPreference.findIndexOfValue(stringValue); 
      if (prefIndex >= 0) { 
       preference.setSummary(listPreference.getEntries()[prefIndex]); 
      } 
     } else { 
      // For other preferences, set the summary to the value's simple string representation. 
      preference.setSummary(stringValue); 
     } 
     return true; 
    } 

} 
} 

は、解像度/レイアウト/ activity_settings.xmlここ

<?xml version="1.0" encoding="utf-8"?> 
<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_settings" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin"> 

</ListView> 

である〜のres/XML/pref_general.xml

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width = "match_parent" 
    android:layout_height = "match_parent"> 

    <EditTextPreference 
     android:title= "@string/pref_location_label" 
     android:key="@string/pref_location_key" 
     android:defaultValue="@string/pref_location_default" 
     android:inputType="text" 
     android:singleLine="true" /> 

</PreferenceScreen> 

私が含まれている場合、私はエラーを取得していますMyPreferenceFragment()。私はPreferenceFragmentの使用に関する文書を読んで、私はその実装で間違いを犯したとは思わない。この問題を解決するために私を助けてください。

編集:私はクラッシュのスタックを追加してい

E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.example.home.sunshine, PID: 19190 
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.home.sunshine/com.example.home.sunshine.SettingsActivity}: java.lang.UnsupportedOperationException: addView(View) is not supported in AdapterView 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2667) 
         at android.app.ActivityThread.-wrap11(ActivityThread.java) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1494) 
         at android.os.Handler.dispatchMessage(Handler.java:111) 
         at android.os.Looper.loop(Looper.java:207) 
         at android.app.ActivityThread.main(ActivityThread.java:5776) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 
        Caused by: java.lang.UnsupportedOperationException: addView(View) is not supported in AdapterView 
         at android.widget.AdapterView.addView(AdapterView.java:474) 
         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:990) 
         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1153) 
         at android.app.BackStackRecord.run(BackStackRecord.java:800) 
         at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1562) 
         at android.app.FragmentController.execPendingActions(FragmentController.java:325) 
         at android.app.Activity.performStart(Activity.java:6619) 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2542) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2667)  
         at android.app.ActivityThread.-wrap11(ActivityThread.java)  
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1494)  
         at android.os.Handler.dispatchMessage(Handler.java:111)  
         at android.os.Looper.loop(Looper.java:207)  
         at android.app.ActivityThread.main(ActivityThread.java:5776)  
         at java.lang.reflect.Method.invoke(Native Method)  
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)  
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)  
+0

質問を編集し、クラッシュに関連するスタックトレース全体を投稿してください。 – CommonsWare

+0

@CommonsWare、私はエラースタック全体を追加しました。 –

答えて

1

レイアウトを削除します。その後、交換してください:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Log.v("Settings:OnCreate","Going to set View in SettingsActivity"); 
    setContentView(R.layout.activity_settings); 
    Log.v("Settings:OnCreate","View is set in SettingsActivity"); 

    //When I don't add the below part, activity_settings is displayed properly. 
    //I am getting the error when this below part is added 
    if(savedInstanceState == null) { 
     getFragmentManager().beginTransaction() 
       .replace(R.id.activity_settings, new MyPreferenceFragment()) 
       .commit(); 
    } 
} 

で:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Log.v("Settings:OnCreate","Going to set View in SettingsActivity"); 
    Log.v("Settings:OnCreate","View is set in SettingsActivity"); 

    //When I don't add the below part, activity_settings is displayed properly. 
    //I am getting the error when this below part is added 
    if(savedInstanceState == null) { 
     getFragmentManager().beginTransaction() 
       .replace(android.R.id.content, new MyPreferenceFragment()) 
       .commit(); 
    } 
} 

また、あなたはあなたのレイアウトや、既存のJavaコードを保持し、代わりにListViewFrameLayoutするレイアウトでactivity_settingsウィジェットを変更することができます。これは少し遅くなり、もう少しメモリを使いますが、うまくいくでしょう。

PreferenceFragmentは、それ自身ListViewを提供します。あなたはそれを必要としません。

+0

android.R.id.contentはどういう意味ですか?それは何ですか? –

+0

@johnsmith: 'android.R.id.content'は、フレームワークによって提供される' FrameLayout'です。 'setContentView()'を使うアクティビティの場合、 'View'の内容は' FrameLayout'に入ります。しかし、 'FrameLayout'をフラグメントトランザクションのターゲットとして使用することもできます。 – CommonsWare

+0

あなたの方法はどちらもうまくいきましたが、今はフラグメントについてより明確なアイデアがあります。大変ありがとう@CommonsWare –

関連する問題