Как действовать на объект MainActivity после того, как пользователь изменил настройки? - PullRequest
0 голосов
/ 08 октября 2018

ЦЕЛЬ: когда пользователь меняет предпочтение в настройках, я хотел бы выполнить действие в основной деятельности.В частности, мне нужно изменить HashMap.

ПРОБЛЕМА: Я не могу найти решение.И я начинаю думать, что мой подход неправильный вверх по течению.

MainActivity

public class MainActivity extends AppCompatActivity {

    // db declaration //
    private SignalDatabase db;  

   private HashMap<Integer, String> RSSIcolorHmap ;





}

НастройкиActivity

public class SettingsActivity extends AppCompatActivity {

     public  static class MainSettingsFragment extends PreferenceFragmentCompat {

     public final static String KEY_ENABLE_BACKGROUND_UPDATE = "enable_background_update";
     public final static String KEY_ENABLE_LAST_KNOWN_LOCATION = "enable_last_known_location";
     public final static String KEY_DELETE_DB_DATA = "delete_db_data";
     public final static String KEY_CHANGE_MAP_COLOR ="change_map_color";

     private SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener;
     @Override
     public void onCreatePreferences(Bundle bundle, String s) {
         // Load the Preferences from the XML file
         addPreferencesFromResource(R.xml.preferences);

         preferenceChangeListener = new 
        SharedPreferences.OnSharedPreferenceChangeListener() {
             @Override
             public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

                 if(key.equals(KEY_DELETE_DB_DATA))
                 {

                     String connectivityType = sharedPreferences.getString(key, null);
                     new DeleteAreaAsync(SignalAreaDatabase.getDatabase(getContext()), connectivityType).execute();

                 } else if(key.equals(KEY_CHANGE_MAP_COLOR)){

                     String gradientColor = sharedPreferences.getString(key, null);
                      /* I want to use this value to take action on MainActivity's HashMap. */

                }

            }
        };

    }

         }

    }

ЧТО Я ПОПЫТАЛ

Я читал о том, как получить эти две (нерабочие) идеи:

# 1 МЕТОД

SettingsActivity settingsActivity = (SettingsActivity)getActivity();
 MapsActivity mapsActivity = (MapsActivity) settingsActivity.getParent();

, но getParent() всегда возвращает null,С веб-сайта разработчика Android:

Возвращает родительское действие, если это представление является вложенным дочерним элементом .

# METHOD2

 SettingsActivity settingsActivity = (SettingsActivity)getActivity();
     MapsActivity mapsActivity = (MapsActivity) settingsActivity.getCallingActivity();

Но в этом случае getCallingActivity() возвращает объект ComponentName, из которого я не могу получить ссылку на относительную активность.

ВОПРОСЫ:

1) Является ли этот подход совершенно неверным в восходящем направлении?Если да, как я могу решить?

2) Если нет, возможно ли заставить один из двух методов, описанных выше, работать?

3) Что именно означает встроенный ребенок?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Ваш дизайн неверен. Вы не можете получить доступ к ссылке MainActivity внутри SettingActivity MainSettingsFragment.Действие предназначено для отображения пользовательского интерфейса, и вам необходимо не допускать, чтобы ваша бизнес-логика была за пределами действия. Если вы хотите обмениваться данными между фрагментом и родительским действием (Host Activity), вы можете использовать интерфейсный подход.

Если вы хотитечтобы получить доступ к ссылке на базу данных Signle в настройке деятельности.создать класс Helper для доступа к базе данных.

0 голосов
/ 08 октября 2018

вам нужно использовать startActivityForResult(), чтобы использовать .getCallingActivity()

... или добавить Bundle к Intent, который передает имя действия.

ComponentName может использоваться с intent.setComponent(componentName).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...