Урок 111. Android 3. Fragments. PreferenceFragment - настройки. Headers

Обсуждение уроков
Wp8Lover
Сообщения: 5
Зарегистрирован: 27 окт 2013, 13:05

Re: Урок 111. Android 3. Fragments. PreferenceFragment

Сообщение Wp8Lover » 28 окт 2013, 13:39

Нет PrefenceActivity, есть Activity с содержимым PreferenceFragment.
В статье написано PreferenceActivity is the base class for an activity to show a hierarchy of preferences to the user. Prior to HONEYCOMB this class only allowed the display of a single set of preference
Но хотелось бы, чтобы понимающие люди объяснили на пальцах.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 111. Android 3. Fragments. PreferenceFragment - нас

Сообщение Mikhail_dev » 28 окт 2013, 20:16

Могу сказать лишь одно, в реализации настроек царит хаос. Как использовать? Лично мы используем банально скрывая его содержимое на основном экране. При показе, просто делаем видимым контейнер с настройками. Костыльно конечно, и это очень не нравится. В чем собственно хаос:
PreferenceActivity (API<11)
PreferenceFragment (API>=11)
Headers - tablets (API only>=11)
ничего - tablets (API<11)
И этот зоопарк надо обслуживать. Я задал вопрос на stackoverflow, но все молчат как партизаны. Боюсь что тут правильный ответ будет, это делать свои настройки. Делайте фрагменты и обрабатывайте нажатия. Вы тем самым уйдете от всего хаоса, что присутствует, + получите кастомизацию настроек.

Wp8Lover
Сообщения: 5
Зарегистрирован: 27 окт 2013, 13:05

Re: Урок 111. Android 3. Fragments.

Сообщение Wp8Lover » 29 окт 2013, 12:19

Если кому интересно вот ссылка на статью с примерами
http://www.mysamplecode.com/2011/11/and ... le_12.html
Мне помогло :)

Tabun
Сообщения: 2
Зарегистрирован: 07 апр 2014, 19:34

Re: Урок 111. Android 3. Fragments. PreferenceFragment - нас

Сообщение Tabun » 07 апр 2014, 19:44

С телефона запустилась, а с планшета нет. Попросила метод : protected boolean isValidFragment (String fragmentName) . Добавил в MainActivity просто пустой метод и на выход true . Запустилось)

denis_po3
Сообщения: 14
Зарегистрирован: 01 ноя 2013, 15:45

Re: Урок 111. Android 3. Fragments. PreferenceFragment - нас

Сообщение denis_po3 » 15 апр 2014, 19:35

Так и не удалось создать конфигурацию эмулятора, которая возвращала бы true для isMultiPane. Уж Nexus 7 точно должен делить экран, а делать этого не хочет. Для проверки работы приложения нашел временное решение проблемы: переопределение onIsMultiPane и установка true в качестве возвращаемого значения метода.

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 111. Android 3. Fragments. PreferenceFragment - нас

Сообщение klblk » 23 апр 2014, 03:22

Если прописать в манифесте у "android:launchMode="singleTask"" у Activity, то заголовки работать не будут... (долго ходил по кругу и не мог понять в чем проблема)
Ну и да, как писалось выше, на KitKat нужно переопределять метод isValidFragment(), о чем в документации сабо собой не написано ничего...

AlexVinn
Сообщения: 81
Зарегистрирован: 04 апр 2014, 04:56

Re: Урок 111. Android 3. Fragments. PreferenceFragment - нас

Сообщение AlexVinn » 30 апр 2014, 18:17

Всё сделал по уроку, правда у меня с фрагментами, выдает ошибку в строке 62
Красным - replace и пишет -
The method replace(int, Fragment) in the type FragmentTransaction is not applicable for the arguments (int, Fragment1)

Я так понял с Preference каша сейчас. Кто-то может посоветовать простой способ сохранения настроек для всех версий ? Или этот код как-то исправить что-бы работало везде. Настройки очень нужны. Хелп, плз.

Что скажете про этот код ? Работает он везде или нет и работает ли с фрагментами ?
http://www.mysamplecode.com/2011/11/and ... le_12.html

MainActivity.java
[syntax=java5]package com.example.p0711_prefsimp;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}

/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {

public PlaceholderFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);

getFragmentManager().beginTransaction()
.replace(android.R.id.content, new Fragment1()).commit();

return rootView;
}
}
}[/syntax]

Fragment1.java
[syntax=java5]package com.example.p0711_prefsimp;

import android.os.Bundle;
import android.preference.PreferenceFragment;

public class Fragment1 extends PreferenceFragment {

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref1);
}

}[/syntax]
Тут должна быть подпись.

Viewer
Сообщения: 180
Зарегистрирован: 30 апр 2014, 11:42

Re: Урок 111. Android 3. Fragments. PreferenceFragment - нас

Сообщение Viewer » 30 апр 2014, 18:58

Примеры из более ранних уроков (71, 72) без фрагментов, будут работать везде на всех версиях Android, то что некоторые методы будут отмечены как Deprecated (если в компилите с Android старше 11) пусть вас не смущает.

AKhorevich
Сообщения: 6
Зарегистрирован: 24 май 2014, 21:01

Re: Урок 111. Android 3. Fragments. PreferenceFragment - нас

Сообщение AKhorevich » 15 мар 2015, 00:10

Как это чудо повязать с другими фрагментами? К примеру:

Код: Выделить всё

 private void selectItem(int position) {
        // Update the main content by replacing fragments
        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new News();
                break;
            case 1:
                fragment = new Needhelp();
                break;
            case 2:
                fragment = new Sectorc();
                break;
            case 3:
                fragment = new Howhelp();
                break;
            case 4:
                fragment = new Howget();
                break;
           case 5:
               fragment = new Fragment1();
                break;



            default:
                break;
        }

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 111. Android 3. Fragments. PreferenceFragment - нас

Сообщение Mikhail_dev » 15 мар 2015, 01:33

Не используйте никогда это чудо. Я не встречал ни одного проекта с ними.

Stannm
Сообщения: 6
Зарегистрирован: 24 мар 2015, 15:12

Re: Урок 111. Android 3. Fragments. PreferenceFragment - нас

Сообщение Stannm » 31 мар 2015, 09:52

Добрый день.
Подскажите, пожалуйста, а можно из настроек запросить какой-либо метод, в котором например проверяется подключение к БД?
Спасибо.

danek130995
Сообщения: 42
Зарегистрирован: 25 янв 2015, 18:57

Re: Урок 111. Android 3. Fragments. PreferenceFragment - нас

Сообщение danek130995 » 22 окт 2015, 11:46

Tabun писал(а):С телефона запустилась, а с планшета нет. Попросила метод : protected boolean isValidFragment (String fragmentName) . Добавил в MainActivity просто пустой метод и на выход true . Запустилось)
Спасибо, Вы помогли)

Night_Scream
Сообщения: 54
Зарегистрирован: 23 сен 2013, 10:51

Re: Урок 111. Android 3. Fragments. PreferenceFragment - нас

Сообщение Night_Scream » 25 окт 2015, 14:51

Привет, помогите советом.

Допустим есть 2 кнопки, я хочу менять настройки (текст,цвет текста) каждой из этих кнопок.
Кликнув по первой откроется активити с PreferenceFragment и в соответствующие поля уже чтобы были записаны текущие значения кнопки, если нужно поменял и после закрытия тут же принялись к кнопке на которую кликал.

Задача в целом тривиальная, как её решить? Как я понял PreferenceFragment заточен для настроек приложения в целом, а не отдельных его частей.

Спасибо всем откликнувшимся.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 111. Android 3. Fragments. PreferenceFragment - нас

Сообщение doter.ua » 25 окт 2015, 15:02

Обычный SharedPreferences + примитивы: цвет - инт, текст -стринг
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Night_Scream
Сообщения: 54
Зарегистрирован: 23 сен 2013, 10:51

Re: Урок 111. Android 3. Fragments. PreferenceFragment - нас

Сообщение Night_Scream » 26 окт 2015, 08:19

doter.ua писал(а):Обычный SharedPreferences + примитивы: цвет - инт, текст -стринг
SharedPreferences хранит в файле?

У меня динамически создаваемые кнопки, могут удаляться\добавляться произвольно, есть класс который расширяет кнопку в нем хранятся настройки кнопок у него сэтеры\гэтеры. Кнопок может быть 1, а может быть 20.
Еслиб были статические 2 кнопки уже б давно решил с SharedPreferences, а тут....

Просто надо вызвать активити (PreferenceFragment) с настройками и передать ему текущие значение запросив гетерами из класса кнопки, поправить настройки в фрагменте и после закрытия надо чтобы новые значения прописались сэтерами, реализовать то можно обычным активити, но как то не комильфо.

Night_Scream
Сообщения: 54
Зарегистрирован: 23 сен 2013, 10:51

Re: Урок 111. Android 3. Fragments. PreferenceFragment - нас

Сообщение Night_Scream » 27 окт 2015, 11:52

up, пацаны, какие варианты?

Аватара пользователя
vorskla
Сообщения: 5
Зарегистрирован: 04 дек 2015, 14:53

Re: Урок 111. Android 3. Fragments. PreferenceFragment - нас

Сообщение vorskla » 02 янв 2016, 20:45

В эмуляторе (АПИ-16) код урока работает полностью, только браузер не открывает страницу.
На телефоне (АПИ-19) открывается только третий заголовок с настройками дисплея, на первом и втором ошибка.

vd.basik
Сообщения: 1
Зарегистрирован: 23 авг 2016, 00:36

Re: Урок 111. Android 3. Fragments. PreferenceFragment - нас

Сообщение vd.basik » 23 авг 2016, 00:49

Здравствуйте!
Есть вопрос по данной теме. Набросал пример, но появилась проблема - не переходит на новый скрин с фрагментом, возможно сможете помочь
MainActivity

Код: Выделить всё

public class MainActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getFragmentManager().beginTransaction().replace(android.R.id.content, new MainPreferenceFragment()).commit();
    }
}
MainPreferenceFragment

Код: Выделить всё

public class MainPreferenceFragment extends PreferenceFragment
{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.main_preference_layout);
    }
}
main_preference_layout

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBoxPreference
        android:key="isEnabledNotifications"
        android:summary="Enable notifications"
        android:title="Notifications">
    </CheckBoxPreference>
    <PreferenceScreen
        android:fragment="com.vds.missedevents.EventsPreferenceFragment"
        android:summary="Ev"
        android:title="Eents"/>
</PreferenceScreen>
EventsPreferenceFragment

Код: Выделить всё

public class EventsPreferenceFragment extends PreferenceFragment
{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.events_preference_layout);
    }
}
events_preference_layout

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceScreen
        android:summary="Ewwwv"
        android:title="Eeeeents">
    </PreferenceScreen>
</PreferenceScreen>
Не переходит на EventsPreferenceFragment. Даже уже не знаю в чем проблема. Виден клик но результата никакого.
Заранее спасибо

EvgenSolovev
Сообщения: 2
Зарегистрирован: 31 май 2017, 11:11

Re: Урок 111. Android 3. Fragments. PreferenceFragment - нас

Сообщение EvgenSolovev » 02 июн 2017, 07:03

vorskla писал(а):В эмуляторе (АПИ-16) код урока работает полностью, только браузер не открывает страницу.
На телефоне (АПИ-19) открывается только третий заголовок с настройками дисплея, на первом и втором ошибка.
Чтобы заработало, добавьте в MainActivity метод:

Код: Выделить всё

protected boolean isValidFragment (String fragmentName){
        return true;
    }
А для того, чтобы открывалась страница, видимо, нужно добавить соответствующие разрешения в MANIFEST

slaveta84
Сообщения: 1
Зарегистрирован: 31 июл 2019, 12:45

Re: Урок 111. Android 3. Fragments. PreferenceFragment - нас

Сообщение slaveta84 » 31 июл 2019, 12:48

Tabun писал(а):
07 апр 2014, 19:44
С телефона запустилась, а с планшета нет. Попросила метод : protected boolean isValidFragment (String fragmentName) . Добавил в MainActivity просто пустой метод и на выход true . Запустилось)
Спасибо, помогло.
Вставил в MainActivity пустой метод и всё заработало

@Override
protected boolean isValidFragment(String fragmentName) {
return true;
}

Ответить