Изменить значение String - Java, Android
Я пишу свой браузер и столкнулся с проблемой. Решил реализовать выбор поискового агрегата, например Google, Яндекс, Mail.ru и т.д.. Сам выбор реализую через PreferenceFragmentCompat, через элемент ListPreference. Теперь сама суть вопроса. Как можно менять значение строки String? Код ниже:
String url = ""; // Тут нужно менять значение строки
String google = "https://google.com/search?q="; // Одна из строк для замены значения
String yandex = "https://yandex.ru/search/?text=";
String mail = "https://go.mail.ru/search?q=";
// Код из onResume
String search = mSharedPreferences.getString(getString(R.string.title_search), "0");
if (search.contains(getString(R.string.google))) {
url = google;
}
if (search.contains(getString(R.string.yandex))) {
url = yandex;
}
if (search.contains(getString(R.string.mail))) {
url = mail;
}
P.S. Буду благодарен любому ответу или наводке. Заранее спасибо.
Ответы (2 шт):
Можно сделать так, конечно
if (search.contains(getString(R.string.google))) {
String url = google;
}
и т.д.
и убрать String url = ""; в начале. Но это не очень красивое решение.
Раз я прав, как вы сказали в комментариях, то вы немного не в ту сторону копаете. Вам нужна подписочная модель. Можно приплести какой-нибудь LiveData или rxJava, если будет не лень, но в самом простом виде это будет выглядеть так же, как работа с OnClickListener или OnLayoutChangeListener
Создаем интерфейс
interface OnUrlChangeListener(){
void onUrlChange(newUrl: String);
}
в месте, где вам нужно как-то обрабатывать ссылку меняем прямое использование поля url на реализацию этого интерфейса. То есть во фрагменте вместо
@override
public void onViewCreated(...){
...
webView.loadUrl(yourObject.url);
}
надо сделать следующее:
public class MyFragment() extends Fragment(), OnUrlListener{
@Override
public void onUrlChange(newUrl: String){ //этот метод будет отрабатывать каждый раз, когда url меняется
if(isAdded() && webView != null){
webView.loadUrl(newUrl);
}
}
@Override
public void onCreate(...){
yourObject.addUrlChangeListener(this) //при создании подписываемся на получение значения url
}
}
и теперь остается добавить логику в этот самый yourObject, чем бы он ни был
private String mUrl = "";
private ArrayList<OnUrlChangeListener> listeners = new ArrayList<OnUrlChangeListener>();
public void addUrlChangeListener(listener: OnUrlChangeListener){
listeners.add(listener); //собираем из всех подписавшихся список подписчиков
listener.onChangeUrl(mUrl) //опционально. после того как кто-то подписался сразу можно сообщить ему текущее значение, можно дожидаться появление нового. Первый путь обычно правильный, но всякое бывает.
}
public void setUrl(newUrl: String){
if(newUrl.contentEquals(mUrl))
return;
mUrl = newUrl;
for(OnChangeUrlListener l: listeners){ //перебираем всех подписчиков и сообщаем об изменении
l.onChangeUrl(mUrl)
}
}
теперь в случае изменения значения url у вас везде, где оно используются, будут происходить какие-то действия. Это лишь грубый пример чтобы можно было уловить суть. Надо еще научить отписываться тем, кто уже подписался, следить за утечками, доступностью, жизненным циклом элементов и еще пару нюансов. Крайне рекомендую. разобраться с LiveData, может даже с ViewModel, они могут сильно упростить отслеживание подписок и сохранению доступности