Настройки Android как сделать информационное предпочтение

В моем приложении для Android у меня есть настройки, которые используют предпочтения.

Есть много предпочтений, таких как ListPreference, SwitchPreference, etc., но нет ни одного из предпочтений, которые мне нужны.

В этом предпочтении я хочу:
1. отображать заголовок, который является постоянным и никогда не изменится (например, другие настройки)
2. отображать текст, который будет изменен приложением, но НЕ пользователем.

Наиболее похоже на это предпочтение EditTextPreference, но для меня это не нормально, потому что я не хочу, чтобы пользователь изменял отображаемый текст, вместо этого мое приложение изменит его. Так что мое предпочтение можно назвать TextViewPreference.

Хороший пример того, что я хочу, находится в приложении для Android «Настройки» в категории «Информация об устройстве».

Редактировать: Код, который я хотел бы использовать для изменения сводки, не будет помещен в код активности, и я не использую PreferenceActivity.
Фактически, единственный раз, когда мне нужно изменить сводку, - это когда SettingsActivity НЕ находится в основном потоке.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
404
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Что вы можете сделать, так это взять EditTextPreference и отключить его. Чтобы субтитры отображались, но не редактировались.

findPreference("your-preference-key").setEnabled(false);

это тоже хороший ответ, но он сделает мои предпочтения "серыми", а принятый не будет

J K 27.03.2018 19:45
Ответ принят как подходящий

Приведенный ниже код является полным примером того, чего вы пытаетесь достичь, он показывает пример того, как создать предпочтение информации, которое напрямую обновляется на основе других предпочтений (добавление x_pref и y_pref и отображение результата в result_pref ниже) или обновляется на основе чего-то, переданного из другой деятельности

1) DemoActivity ----------

public class DemoActivity extends AppCompatActivity{


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

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.demo_preferences, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch(item.getItemId()) {
        case R.id.menu_settings:
            Intent i = new Intent(DemoActivity.this , PrefDemoActivity.class);
            i.putExtra("Passed", "Test--##%%&&");
            startActivity(i);
            break;
        default:
            throw new RuntimeException("unknown menu selection");
    }

    return true;
}
}

2) demo_activity.xml ----------

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

<TextView
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:text = "Empty"
    android:gravity = "center"
    android:background = "@android:color/holo_blue_light"/>

</android.support.constraint.ConstraintLayout>

3) PrefDemoActivity ----------

public class PrefDemoActivity extends AppCompatActivity {

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

    FragmentManager mFragmentManager = getFragmentManager();
    FragmentTransaction mFragmentTransaction = mFragmentManager
            .beginTransaction();
    DemoEditPreferences mDemoPrefsFragment = new DemoEditPreferences();
    mFragmentTransaction.replace(android.R.id.content, mDemoPrefsFragment);
    mFragmentTransaction.commit();

}
}

4) DemEditPreferences ----------

public class DemoEditPreferences extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener{

private SharedPreferences demo_preferences;
private int preferencesToEdit;

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

    demo_preferences = getActivity().getSharedPreferences("demo_preference",
            0);

    preferencesToEdit = R.xml.demo_preferences;
    String preferenceName = getResources().getString(R.string.pref_sensor_key);

    PreferenceManager preferenceManager = getPreferenceManager();
    preferenceManager.setSharedPreferencesName(preferenceName);
    preferenceManager.setSharedPreferencesMode(0);

    getActivity().setTitle("Demo Preferences");

    addPreferencesFromResource(preferencesToEdit);

    Preference from_another_activity_p = (Preference) findPreference("passed_from_another_activity_key");

    if (getActivity().getIntent() != null) {

        from_another_activity_p.setSummary(getActivity().getIntent().getStringExtra("Passed"));
    }

    updateResult();

    for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {
        initSummary(getPreferenceScreen().getPreference(i));
    }

}


@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

    if (findPreference(key) != null) {

        if (findPreference(key).getKey().equals("x_key")) {

            updateResult();

        }else if (findPreference(key).getKey().equals("y_key")) {


            updateResult();

        }

        checkPrefValueValidity(findPreference(key));
        updatePrefSummary(findPreference(key));
    }

}

private void updateResult(){

    EditTextPreference x_p = (EditTextPreference) findPreference("x_key");
    EditTextPreference y_p = (EditTextPreference) findPreference("y_key");
    Preference result_p = (Preference) findPreference("result_key");
    result_p.setSummary("( X + Y ) = " + (Float.valueOf(x_p.getText()) + Float.valueOf(y_p.getText())));

}

private void initSummary(Preference p) {
    if (p instanceof PreferenceCategory) {
        PreferenceCategory pCategory = (PreferenceCategory) p;
        for (int i = 0; i < pCategory.getPreferenceCount(); i++) {
            initSummary(pCategory.getPreference(i));
        }
    } else {
        updatePrefSummary(p);
    }
}

private void updatePrefSummary(Preference p) {
    if (p instanceof ListPreference) {
        ListPreference listPref = (ListPreference) p;
        p.setSummary(listPref.getEntry());
    }
    if (p instanceof EditTextPreference) {
        EditTextPreference editTextPref = (EditTextPreference) p;
        p.setSummary(editTextPref.getText());
    }
}

private void checkPrefValueValidity(Preference p) {
    if (p instanceof EditTextPreference) {
        EditTextPreference editTextPref = (EditTextPreference) p;
        if (editTextPref.getText().equals("")) {
            // what do you want to do if the value entered is empty
        } else {
            // maybe only certain values are allowed
        }
    }
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = super.onCreateView(inflater, container, savedInstanceState);
    view.setBackgroundColor(getResources().getColor(android.R.color.white));
    return view;
}

@Override
public void onResume() {
    super.onResume();
    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onPause() {
    super.onPause();
    getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}

@Override
public void onDestroy() {
    super.onDestroy();
    getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}

}

5) demo_menu ----------

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

<item android:id = "@+id/menu_settings"
    android:title = "Settings"
    android:titleCondensed = "Settings"
    android:orderInCategory = "1">
</item>

</menu>

7) demo_preferences ----------

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

<PreferenceCategory
    android:title = "Demo">

    <EditTextPreference
        android:key = "x_key"
        android:title = "X"
        android:defaultValue = "0"
        android:summary = "0"
        android:inputType = "numberDecimal|numberSigned"
        android:selectAllOnFocus = "true"
        android:singleLine = "true">
    </EditTextPreference>

    <EditTextPreference
        android:key = "y_key"
        android:title = "Y"
        android:defaultValue = "0"
        android:summary = "0"
        android:inputType = "numberDecimal|numberSigned"
        android:selectAllOnFocus = "true"
        android:singleLine = "true">
    </EditTextPreference>

    <Preference
        android:key = "result_key"
        android:title = "Result"
        android:summary = "0"> // default summary value if any
    </Preference>

    <Preference
        android:key = "passed_from_another_activity_key"
        android:title = "From another Activity"
        android:summary = "null"> // default summary value if any
    </Preference>

</PreferenceCategory>

</PreferenceScreen>

8) Не забудьте добавить в манифест оба действия.

Подождите ... в каком классе размещен метод findPreference? Я получаю ошибку "не удается разрешить метод"

J K 27.03.2018 20:15

Предпочтение отображается так, как я хочу, но я не могу изменить его сводку.

J K 27.03.2018 20:17

Вы можете найти его в классе, который расширяет PreferenceActivity или PreferenceFragment.

Brainnovo 28.03.2018 05:36

Другие вопросы по теме