2015-03-03 1 views
0

Что я действительно хочу сделать, так это добавить экран предпочтений к существующему макету с другими элементами в нем (например, кнопкой) без использования устаревших подходов. Я посмотрел кнопку «добавить кнопку на экран предпочтений», и я получаю это на полурабочее время, используя устаревшие подходы.Ошибки PreferenceFragment на id.list, но не на id.content

У меня есть два xml-макета. Первый экран предпочтения (на данный момент PreferenceCategory является излишним) с 12 другими CheckBoxPreferences опущены для ясности:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
<PreferenceCategory 
    android:key="@string/specialization_prefs" 
    android:title="@string/select_specializations"> 

    <CheckBoxPreference 
     android:key="@string/pulse_ox_key" 
     android:title="@string/pulse_ox" 
     android:defaultValue="true" /> 

    <CheckBoxPreference 
     android:key="@string/bp_key" 
     android:title="@string/bp" 
     android:defaultValue="true" /> 

</PreferenceCategory> 

Тогда у меня есть макет активности (PreferenceActivity или деятельности; кажется, не имеет значения):

<?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:id="@+id/specializations_layout" > 

<Button 
    android:id="@+id/btn_done" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:text="Exit and Save" /> 

<ListView android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 
</RelativeLayout> 

элемент управления ListView должен был быть фиктивной быть заменен PreferenceFragment, который я получил от предложения StackOverflow. Кнопка, которую я хочу сохранить.

Мой PreferenceFragment выглядит следующим образом:

public class SpecializationsFragment extends PreferenceFragment 
{ 

    @Override 
    public void onAttach(Activity specializationsActivity) 
    { 
     super.onAttach(specializationsActivity); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.specializations); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     return super.onCreateView(inflater, container, savedInstanceState); 
    } 
} 

Наконец мой PreferenceActivity выглядит следующим образом:

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

     setContentView(R.layout.specializations_layout); 

     getFragmentManager().beginTransaction() 
      .replace(android.R.id.list, new SpecializationsFragment()) 
      .commit(); 
    } 
} 

Если я заменю 'android.R.id.list' с «android.R. id.content 'это своего рода работы. Я вижу свою кнопку, но мой экран настроек прокручивается прямо над ним. Это то, что я получаю, когда я следую решению устаревшей кнопки. Если я использую «android.R.id.list» вместо этого, приложение аварийно скажет, что «addView (View) не поддерживается в AdapterView.

Я также искал эту проблему. Что мне не хватает? в настоящее время ничего не делает, кроме графического интерфейса. Что мне нужно добавить, чтобы отобразить кнопку, и экран предпочтений для прокрутки в пространстве под ним, как это предполагается сделать в собственном «фрагменте»? Я думал, что это было целое (да, они действительно работают достаточно хорошо, пока экраны предпочтений отсутствуют). Также не имеет значения, используя метод «добавить» в сравнении с методом «replace».

ответ

0

Для тех, кто заботится, я нашел Я не ожидал, но это сработало. Сначала мне нужно было разложить макет в моем макете. Затем мне нужно было выровнять это n расположенную ниже кнопки. Мне также нужен был фиктивный ListView, но я не знаю, почему. Таким образом, 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" > 

<Button 
    android:id="@+id/btn_done" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:text="Exit and Save" /> 

<RelativeLayout 
    android:layout_below="@+id/btn_done" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/specializations_layout" > 

    <ListView android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 
    </RelativeLayout> 
</RelativeLayout> 

код теперь имеет метод замены (не используя «добавить» или «заменить» никакой разницы), используя идентификатор, добавленным к вложенному относительному макету следующим образом:

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

    setContentView(R.layout.specializations_layout); 

    // Display the fragment as the main content. 

    getFragmentManager().beginTransaction() 
      .replace(R.id.specializations_layout, new SpecializationsFragment()) 
      .commit(); 
    findViewById(android.R.id.list).setBackgroundColor(Color.argb(0, 0, 0, 0)); 
} 

Я не понимаю, что здесь происходит под капотом, особенно с необходимостью для фиктивного элемента и его андроида: атрибут id/list. Я бы хотел, чтобы он работал без элемента ListView, как я полагаю, это будет случай, если это обычный фрагмент, а не экран предпочтений. Я был бы признателен всем, кто может объяснить это мне!