Android Blog App, я должен использовать Sharedpreferences или Intents? - PullRequest
0 голосов
/ 02 мая 2018

Я создаю приложение для Android, на следующих страницах текущего пользователя можно нажимать, я сохраняю идентификатор страницы, по которому щелкнули, и пропускаю его, чтобы открыть соответствующую страницу, после открытия пользователь может проверить список подписчиков, посты внутри страницы и т. д.

Вот корневой узел, который содержит все дочерние страницы (структура базы данных Firebase):

pageData

      id1
         +page_id
         +page_name
         +page_posts
            -001
               -post_id
               -contents
               ....

userData
      -001
         -user_id
         -user_name
         ....

followData
      -001 
        -page_id
        -follow_id
        -user_id

Каков наилучший способ передачи идентификатора страницы между (followListActivity, PostsActivity, AboutPageActivity)?

Я прочитал это https://github.com/flutter/flutter/issues/15307, он говорит, что не следует использовать общие настройки, я уже использовал намерения для передачи значения и извлечения его внутри onCreate(), но когда состояние активности изменяется (onStart () page_id имеет значение null), я использую для навигации нижнее навигационное меню.


Редактировать решение найдено: Джефф Гилфелт Спасибо Глобальная переменная Android

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

На самом деле стандартный способ передачи параметров дочерним действиям и фрагментам - через Intents. Вы можете передать любое примитивное значение, любой массив [] примитивных объектов, несколько ArrayLists <> и даже любой Parcelable объект,

Я использую следующую процедуру в моем коде:

public static void runChildActivity(@NonNull Activity context, int code, @NonNull Class<? extends Activity> activityClass, @Nullable Bundle parameters) {
        Intent intent = new Intent(context, activityClass);
        if (parameters != null) intent.putExtras(parameters);
        context.startActivityForResult(intent, code);
}

И затем, вы можете назвать это так:

Bundle parameters = new Bundle();
parameters.putString("page_id", xxxx);
parameters.putFloat("temperature", 24.5f);
parameters.putParcelable("complexobject", yourParcelableObject);

runChildActivity(context, CODE, PostsActivity.class, parameters);

Параметр CODE (int) - это код, который вы присваиваете своему activity на тот случай, если он также возвращает значения. Затем вы можете проверить возвращаемые значения в переопределенном onActivityResult() в вызывающем действии. Если ваша активность не возвращает никакого значения, параметр не имеет значения.

В дочернем упражнении вы можете получить параметры в onCreate (или в любом месте после него):

@Override
public void onCreate(Bundle savedInstanceState) {

    Bundle parameters = getIntent().getExtras();

    // in a fragment it'd be
    // Bundle parameters = getArguments();

    // those are the parameters passed. Second value is default
    // value in case parameter is not found.

   String pageId = parameters.getString("page_id", "-1");
   float temperature = parameters.getFloat("temperature", 0f);

}

Если вы хотите затем вернуть материал из вашего дочернего действия обратно в родительское действие, вы затем используете setResult() в дочернем действии до finish():

. (child activity)
.
.
private void finishWithParameters() {

    Bundle parameters = new Bundle();
    parameters.putString("returnvalue", "user is crazy");
    parameters.putInteger("filesdownloaded", 43);
    Intent i = new Intent();
    i.putExtras(parameters);
    setResult(Activity.RESULT_OK, i);
    finish();
}
.
.
.

А потом в вызывающей деятельности:

.
.
.
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

     if (requestCode == CODE && data != null) {
        // that's the CODE we ran runChildActivity() with
        // so stuff is coming from that child activity

        Bundle parameters = data.getExtras();
        int filesDownloaded = parameters.getInt("filesDownloaded")

        // ... or directly, without even getting the bundle ....

        int filesDownloaded2 = data.getIntExtra("filesDownloaded")


     }  

}
0 голосов
/ 02 мая 2018

Это правильно, что вы не должны злоупотреблять sharePreferences для передачи данных между действиями, и вы всегда можете сохранить свои данные с помощью метода onSaveInstanceState :

@Override
protected void onSaveInstanceState(Bundle outState) {
  super.onSaveInstanceState(outState);
  outState.putString("page_id", pageID);
}

и получить его из onRestoreInstanceState или onCreate :

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  pageID = savedInstanceState.getString("page_id");
}

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  if (savedInstanceState!=null)
    pageID = savedInstanceState.getString("page_id");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...