Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Значение EditTextPreference

Здравствуйте.
Существует public class Settings extends PreferenceActivity,
он загружает .xml с EditTextPreference.

Пытаюсь на class startView extends Activity получить значение EditTextPreference:
Код C++
1
2
3
4
5
6
7
8
9
10
11
12
               Settings cv = new Settings();//создаю объект класса т.к. eclipse ругается на 
                                           //метод findPreference(String), если класс extends Activity
        
        EditTextPreference diff = (EditTextPreference) cv.findPreference("new1");
                
        String new_value = (String) (diff.getText());//На этом месте программа вылетает
 
 
        diff.setOnPreferenceChangeListener(this);
 
        TextView addLink = (TextView) findViewById(R.id.newLink);
                addLink.setText(new_value);
Какие варианты есть, чтобы получить в другом классе значение EditTextPreference?
Ответ: в EditTextPreference поставь android:inputType="number"
Вопрос: PreferenceFragment custom dialog

Добрый день.
Хочу свой диалог по клику на EditTextPreference, событие нажатия можно получить так

Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
 editTextPreference.setOnPreferenceClickListener(
 new Preference.OnPreferenceClickListener() {
 public boolean onPreferenceClick(Preference preference) {
//action
 return true;
}
});
Вместо action хочу вставить свой alert builder, но стандартный мешает, как сделать чтобы стандартный не появлялся???


На xml странице 3 EditTextPreference и в идеале для каждого свой диалог сделать.
Ответ: Ханасака, да нет, не обязательно.
Сначало создал свой объект унаследованный от EditTextPreference и там всё настраивал, получилось громоздко.
Потом пошел по самому простому пути.
в setOnPreferenceClickListener вызвал .getDialog().dismiss();
и прописал свой alert dialog, всё работает и настраивается как надо для каждого EditTextPreference.
Не знаю насколько это правильно?
Вопрос: Вместо if() применить switch()

Как тут вместо if применить switch?
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ListPreference typeScreenTimeOut = (ListPreference) findPreference("pref_type_screen_time_out_tile");
 
            final EditTextPreference subscriptionPref = (EditTextPreference) findPreference("pref_subscription");
 
            typeScreenTimeOut.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                @Override
                public boolean onPreferenceChange(Preference preference, Object o) {
 
                    if (o.equals("1")) {
                        subscriptionPref.setEnabled(true);
                    } else if (o.equals("2")) {
                        subscriptionPref.setEnabled(false);
                    }
                    return true;
                }
Ответ: Alexvsalex, от души! Учусь. Вот с Project structure меня в тупик поставили. Без этого обошлось. Спасибо.
Вопрос: Day night тема подскажите как применять?

Всем привет, не пинайте ногами за глупый вопрос.
Есть NAvigation drawer с фрагментами и несколькими активити.
В MyPreferenceActivity сделал PreferenceFragment там разместил настройки.

в общем по нажатию смены темы - тема меняется только после перезапуска программы.
Ну а нужно конечно же сразу что бы менялась.

вот кнопка :
XML
1
2
3
4
5
6
7
8
<ListPreference
            android:defaultValue="1"
            android:entries="@array/theme"
            android:entryValues="@array/theme_entries"
            android:icon="@drawable/ic_add_business"
            android:key="@string/list_theme"
            android:summary="Светлая или темная"
            android:title="Тема приложения" />

вот так вызываю в DrawerActivity. Вынес отдельно в метод.

Java
1
2
3
4
5
on Create 
 
 prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
 
        setDefaultNightMode ();
ну и сам метод

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void setDefaultNightMode() {
 
        String regular = prefs.getString(getString(R.string.list_theme), "1");
 
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
 
        if (regular.contains("2")){
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            
 
        }else
        if (regular.contains("3"))
        {AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO);
 
        }
    }
Подскажите с кодом или где почитать. Спасибо.

Добавлено через 4 часа 37 минут
Немного покопался и переделал таким образом:
перенес всю логику во фрагмент настроек

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
changeTheme = (ListPreference)findPreference(getString(R.string.list_theme));
        changeTheme.setKey(getString(R.string.list_theme));
        changeTheme.setEntries(R.array.theme);
        changeTheme.setEntryValues(R.array.theme_entries);
        changeTheme.setDefaultValue("1");
 
        changeTheme.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object defaultValue) {
 
                int index = changeTheme.findIndexOfValue(defaultValue.toString());
 
                if (index == 0) {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
 
                }
                else if (index == 1) {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
 
 
                } else if (index == 2) {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO);
                    
                }else {
 
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                }
                
                return true;
            }
 
        });
Остается вопрос - насколько это правильно
И как применять тему на лету.
метод getActivity().recreate() при выборе фрагмент пересоздает но тема не меняется... меняется только при выходе из активити настроек. Буду благодарен.
Ответ: И все таки не могу допереть почему то смешиваются цвета.
Объясните кто нибудь доходчиво.

Суть проблемы - упрощаю задачу - ставлю по умолчанию тему - ночь.
Есть NavigationDrawer в нем 9 фрагментов.
При создании тема включается без вопросов.
НО
Если переключаю после старта сразу на 9 - (там webView) - а потом на первый фрагмент - цвета как бы перемешиваются.
То есть берется половина день - половина - ночь.
Не могу допереть в чем ошибка.
Причем все активити обрабатываются корректно в плане цвета - смешивается только главные цвета на дровере

Значит вот код:

Сама тема

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
        <!-- Основная тема приложения. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
 
 
 
    <style name="AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
        <item name="autoCompleteTextViewStyle">@style/cursorColor</item>
    </style>
 
    <!-- цвет курсора в поиске-->
 
    <style name="PopupOverlay" parent="ThemeOverlay.AppCompat.Light">
        <item name="autoCompleteTextViewStyle">@style/cursorColor</item>
    </style>
 
    <!-- тема для заставки -->
    <style name="FullscreenTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:actionBarStyle">@style/FullscreenActionBarStyle</item>
        <item name="android:windowActionBarOverlay">true</item>
        <item name="android:windowBackground">@null</item>
        <item name="metaButtonBarStyle">?android:attr/buttonBarStyle</item>
        <item name="metaButtonBarButtonStyle">?android:attr/buttonBarButtonStyle</item>
    </style>
потом Активити:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    int mCurTheme;
 
    static {
        AppCompatDelegate.setDefaultNightMode(
                AppCompatDelegate.MODE_NIGHT_YES);
    }
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      
    
 
        setContentView(R.layout.drawer_main);
        toolbarDrawer = (Toolbar) findViewById(R.id.toolbarDrawer);
        setSupportActionBar(toolbarDrawer);
        toolbarDrawer.setCollapsible(true);
        initDrawer(toolbarDrawer);//выносим тулбар в отдельный метож
        prefs = PreferenceManager.getDefaultSharedPreferences(this);
        navigationView = (NavigationView) findViewById(R.id.nav_view);
 
       headerButtonDayNight();//кнопка смены темы
        navigationView.setNavigationItemSelectedListener(this);
 
        firstStartCheck();
        if (savedInstanceState == null) {
 
 // Set the local night mode to some value
            getDelegate().setLocalNightMode(
                    AppCompatDelegate.MODE_NIGHT_YES);
            // Now recreate for it to take effect
            recreate();
 
            Fragment fragment = null;
            Class fragmentClass;
            fragmentClass = Fragment_taxi_0.class;
            try {
                fragment = (Fragment) fragmentClass.newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager
                    .beginTransaction()
                    .replace(R.id.container22, fragment)
                    .commit();
        }
 
 
    }
Вопрос: Не открывается сохраненный файл

написал текстовый редактор для Android, имеют кнопки сохранения и открытия по названию файла, файл сохраняется, но не открывается, пишет, что "Файл не существует" в манифесте всё прописано.

Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
package com.example.qwert.diplomproject;
 
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.Toast;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
 
 
public class MainActivity extends AppCompatActivity {
    public String FILENAME = null;
    public EditText mEditText;
    private String path = Environment.getExternalStorageDirectory().toString() + "/files";
 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mEditText = (EditText) findViewById(R.id.editText);
    }
 
    @Override
    public boolean onCreateOptionsMenu (Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    @Override
    public void onResume()
    {
        super.onResume();
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        // читаем установленное значение из CheckBoxPreference
 
        // читаем размер шрифта из EditTextPreference
        float fSize = Float.parseFloat(
                prefs.getString(getString(R.string.pref_size), "20"));
        // применяем настройки в текстовом поле
        mEditText.setTextSize(fSize);
 
        // читаем стили текста из ListPreference
        String regular = prefs.getString(getString(R.string.pref_style), "");
        int typeface = Typeface.NORMAL;
 
        if (regular.contains("Полужирный"))
            typeface += Typeface.BOLD;
 
        if (regular.contains("Курсив"))
            typeface += Typeface.ITALIC;
 
        // меняем настройки в EditText
        //mEditText.setTextSize(fSize);
        mEditText.setTypeface(null, typeface);
 
        // читаем цвет текста из CheckBoxPreference
        // и суммируем значения для получения дополнительньк цветов текста
        int color = Color.BLACK;
        if (prefs.getBoolean(getString(R.string.pref_color_red), false))
            color += Color.RED;
        if (prefs.getBoolean(getString(R.string.pref_color_green), false))
            color += Color.GREEN;
        if (prefs.getBoolean(getString(R.string.pref_color_blue), false))
            color += Color.BLUE;
 
        mEditText.setTextColor(color);
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_exit) {
            System.exit(0);
        }
        switch (item.getItemId()) {
            case R.id.action_clear:
                mEditText.setText("");
                Toast.makeText(getApplicationContext(),"Очищено", Toast.LENGTH_SHORT).show();
                return true;
 
            case R.id.action_open:
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("Имя файла");
                builder.setMessage("Введите имя файла для открытия");
                final EditText input = new EditText(this);
                builder.setView(input);
                builder.setPositiveButton("Открыть", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        mEditText.setText("");
                        String value = input.getText().toString();
                        FILENAME = value;
                        File file = new File(path + FILENAME);
                        if (file.exists() && file.isFile()) {
                            mEditText.setText(openFile(FILENAME));
                        } else {
                            Toast.makeText(MainActivity.this, "Файла не существует", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
                builder.show();
                return true;
 
            case R.id.action_save:
                AlertDialog.Builder alert = new AlertDialog.Builder(this);
                alert.setTitle("Имя файла");
                alert.setMessage("Введите имя файла для сохранения");
                final EditText input2 = new EditText(this);
                alert.setView(input2);
                alert.setPositiveButton("Сохранить", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        String value = input2.getText().toString();
                        FILENAME = value;
                        saveFile(FILENAME, mEditText.getText().toString());
                    }
                });
                alert.setNegativeButton("Отмена", new DialogInterface.OnClickListener(){
                    @Override
                    public void onClick(DialogInterface dialog, int which){
                       Toast.makeText(MainActivity.this, "Отменено", Toast.LENGTH_SHORT).show();
                    }
                });
                alert.show();
                return true;
            case R.id.action_settings:
                Intent intent = new Intent();
                intent.setClass(this, SettingsActivity.class);
                startActivity(intent);
                return true;
            default:
                return true;
        }
    }
    //Метод для сохранения файла
    private void saveFile(String FILENAME, String body) {
        try {
            File root = new File(this.path);
            if(!root.exists()){
                root.mkdirs();
            }
            File file = new File(root, FILENAME);
            FileWriter writer = new FileWriter(file);
            writer.append(body);
            writer.flush();
            writer.close();
            Toast.makeText(getApplicationContext(), "Сохранено", Toast.LENGTH_SHORT).show();
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //Метод для открытия файла
    private String openFile(String FILENAME) {
        StringBuilder text = new StringBuilder();
        try{
            File file = new File(this.path, FILENAME);
            BufferedReader br = new BufferedReader(new FileReader(file));
            String line;
            while ((line = br.readLine())!=null) {
                text.append(line + "\n");
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return text.toString();
 
 
    }
 
}
Ответ: Паблито, вроде нет, он там сам резолвит эту ситуацию.
Сообщение от MarselGab
private String path = Environment.getExternalStorageDirectory().toString() + "/files";
Что-то вот эта конструкция мне не нравится
Вопрос: При вводе цифр не видна часть клавиатуры

День добрый.
Обратился ко мне человек с проблемой на устройстве samsung galaxy A3 (андроид 6.0.1).
У него при вводе цифр, не видно нижней части с кнопками на клавиатуре.
Скрин приложил.



У меня в Activity есть FrameLayout, в него ложится PreferenceFragment с EditTextPreference (numeric="integer").
При клике на это поле появляется не полностью клавиатура.
Приложение только в landscape.
На других эмуляторах\устройствах такого замечено не было.

Из-за чего это?
Ответ: Всем спасибо, проблему решили установкой другой клавиатуры из магазина Google Play.
Вопрос: Ошибка со строковыми массивами

При запуске активити выдает вот эту ошибку: Error:Error: Duplicate resources: D:\Education\MyApplication\app\src\main\res\values-ru\array.xml:array-ru/entryvalues_lang, D:\Education\MyApplication\app\src\main\res\values-ru\strings.xml:array-ru/entryvalues_lang
На всякий случай, вот array.xml:
XML
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<resources><string-array name="entries_lang">
    <item>Язык аппарата</item>
    <item>Английский</item>
    <item>Русский</item>
</string-array>
    <string-array name="entryvalues_lang">
        <item>default</item>
        <item>en</item>
        <item>ru</item>
    </string-array></resources>
И xml файл активити:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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">
        <PreferenceCategory>
        <ListPreference
            android:key="lang"
            android:title="@string/LangTitle"
            android:summary="@string/LangSummary"
            android:entries="@array/entries_lang"
            android:entryValues="@array/entryvalues_lang"
            android:dialogTitle="@string/LangDialogTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:defaultValue=""/>
        </PreferenceCategory>
    </PreferenceScreen>
Больше и добавить нечего... Помогите, пожалуйста!
Ответ: наверное стоило показать содержимое самого файла на который ругается