Почему на TextView с одинаковыми id в разных layout отображается одинаковый текст?

Есть такой код фрагмета:

public class FragmentSettings extends Fragment {
    @Bind(R.id.settings_layout) LinearLayout settingsLayout;

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = (ViewGroup) inflater.inflate(R.layout.fragment_settings, null);
        ButterKnife.bind(this, v);

        settingsLayout.addView(IconTextView.create(
                getResources().getDrawable(R.drawable.settings_profile),
                "Profile data",
                getActivity(),
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        startActivity(new Intent(getActivity(),
                                ProfileSettingActivity.class));
                    }
                }
        ));

        settingsLayout.addView(IconTextView.create(
                getResources().getDrawable(R.drawable.settings_notifications),
                "Notifications",
                getActivity(),
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        startActivity(new Intent(getActivity(),
                                NotificationSettingActivity.class));
                    }
                }
        ));

      return v;
    }

....


public class IconTextView extends FrameLayout{
    private static int res = R.layout.settings_element;

    public IconTextView(Context context) {
        super(context);
    }

    public static IconTextView create(Drawable icon, String text, Context context, OnClickListener listener) {
        IconTextView view = new IconTextView(context);
        View content = ((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(res, view, false);
        ((ImageView) content.findViewById(R.id.icon)).setImageDrawable(icon);
        ((TextView) content.findViewById(R.id.setting_title)).setText(text);
        view.addView(content);
        view.setOnClickListener(listener);
        return view;
    }
}


setting_element layout:
55995b4f11104d3b9b164a31b245fd86.PNG

Состояние при первом запуске:
1f59c26d48d0469884b7471c29cdb967.png

Состояние после появления бага:
7a126ab6e5c74154a89f35299bdd6a42.png

Если открыть другую Активити, а потом вернуться в этот фрагмент, ВСЕ пункты настроек отображают текст последнего пункта. Если убрать Тест (как на скриншоте), то оба пункта будут Notifications.

Факты:
1. В конце работы onCreateView текст правильный в обоих случаях, вероятно баг происходит где-то в районе fragment.onStart или onDestroy
2. Если у title фрагмента ("Settings") поставить id "setting_title", то он тоже меняет свой текст на текст последнего пункта настроек.
3. До этого вместо кастомного view юзал include и забивал текст в методе фрагмента - результат тот же, баг появлялся.
4. ButterKnife не виноват, без него баг тоже появляется
5. С иконками при этом все в порядке, хотя вызываются они тем же способом
  • Вопрос задан
  • 767 просмотров
Решения вопроса 1
@kamiLLxiii
Android-разработчик
При уходе и возвращении на другую Activity у фрагмента должен вызваться on(Save/Restore)InstanseState(). Скорее всего у тебя эти методы не переопределены, поэтому система сама сохраняет состояние твоих TextView, а потом сама и восстанавливает. Так как id у них одинаковы, (а сохранение происходит по id) каждый следующий текст перетирает предыдущий и при восстановлении от прописывается во все TextView
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@onepavel
Консультация и разработка мобильных приложений
Из того, что выложено, я багу не вижу.
Предлагаю переопределить TextView и посмотреть, кто сетит текст.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы