Обновить макет после написания SharedPreferences?

Моя первая ветка здесь - извините, если форматирование текста плохое.

Я использую Android Studio 3.1.3 API27 и работаю над приложением для смартфона.

В настоящее время приложение состоит из 1 действия (разделенного на 3 фрагмента), второго действия и 5 файлов xml.

Используя ViewPager, я могу пролистывать 3 фрагмента.

2-й фрагмент (средний фрагмент) содержит 2 кнопки, каждая из которых открывает 2-е действие, содержащее много цветных кнопок.

При нажатии на цветные кнопки я могу изменить цвета фона 1-го фрагмента.

После выбора цвета второе действие закрывается, и я снова возвращаюсь к действию 1 -> фрагмент2.

Работает, но ПРОБЛЕМА в том, что мне всегда нужно смахивать до 3-го фрагмента, затем вернемся ко второму, а затем к первому.

Если я этого не сделаю, цвета фрагмента 1 останутся прежними.

Теперь ищу способ обновить макет фрагмента 1, как только я нажму цветную кнопку действия 2.

Я уже пробовал это:

  • при написании SharedPreferences (Activity2) я использую editor.apply () вместо editor.commit ()
  • при чтении SharedPreferences (Activity1 -> Fragment1) я использую Context.MODE_MULTI_PROCESS вместо Context.MODE_PRIVATE
  • используя viewpage.setOffscreenPageLimit (0); в MainActivity внутри моего метода public void SetUpViewPager (ViewPager viewpage).

Но ничего не помогло.

Вот как это выглядит:

Обновить макет после написания SharedPreferences?

MainActivity.java (действие 1):

import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.view.Menu;
    import android.view.MenuItem;
    import java.util.ArrayList;
    import java.util.List;

    public class MainActivity extends AppCompatActivity
    {
        ViewPager vp;

        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ViewPager vp = findViewById(R.id.vp);
            SetUpViewPager(vp);
        }
        public void SetUpViewPager(ViewPager viewpage)
        {
            MyViewPagerAdapter Adapter = new MyViewPagerAdapter(getSupportFragmentManager());
            Adapter.AddPageFragment(new Page_1(), "Page 1");
            Adapter.AddPageFragment(new Page_2(), "Page 2");
            Adapter.AddPageFragment(new Page_3(), "Page 3");
            viewpage.setOffscreenPageLimit(0);
            viewpage.setAdapter(Adapter);
        }
        public class MyViewPagerAdapter extends FragmentPagerAdapter
        {
            private List<Fragment> MyFragment = new ArrayList<>();
            private List<String> MyPageTitle = new ArrayList<>();

            public MyViewPagerAdapter(FragmentManager manager)
            {
                super(manager);
            }
            public void AddPageFragment(Fragment Frag, String Title)
            {
                MyFragment.add(Frag);
                MyPageTitle.add(Title);
            }
            @Override
            public Fragment getItem(int i)
            {
                return MyFragment.get(i);
            }

            @Nullable
            @Override
            public CharSequence getPageTitle(int position)
            {
                return MyPageTitle.get(position);
            }

            @Override
            public int getCount()
            {
                return 3;
            }
        }
        @Override
        public boolean onCreateOptionsMenu(Menu menu)
        {
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }
        @Override
        public boolean onOptionsItemSelected(MenuItem item)
        {
            int id = item.getItemId();

            if (id == R.id.action_settings)
            {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }

Page_1.java (Действие 1 -> Фрагмент 1):

import android.content.Context;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.constraint.ConstraintLayout;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    import static android.content.Context.MODE_PRIVATE;

    public class Page_1 extends Fragment
    {
        int backgroundColorLeft, backgroundColorRight, textColorLeft, textColorRight; // Variables for SharedPreferences

        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            View PageOne = inflater.inflate(R.layout.page1, container, false); // Link view to layout?
            return PageOne;
        }

        @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState)
        {
            SharedPreferences prefs = getActivity().getSharedPreferences("bgColor", Context.MODE_MULTI_PROCESS); // Load saved shared file
            backgroundColorLeft = prefs.getInt("backgroundColorLeft", backgroundColorLeft); // Load saved background color for left layout
            textColorLeft = prefs.getInt("textColorLeft", textColorLeft); // Load saved text color for left layout
            backgroundColorRight = prefs.getInt("backgroundColorRight", backgroundColorRight); // Load saved background color for right layout
            textColorRight = prefs.getInt("textColorRight", textColorRight); // Load saved text color for right layout

            RelativeLayout relLayoutLeft = getActivity().findViewById(R.id.rel_layout_left); // Link variable to ID of left layout
            relLayoutLeft.setBackgroundColor(backgroundColorLeft); // Change background color of left layout
            TextView tvLeft = getActivity().findViewById(R.id.tv_left); // Link variable to ID
            tvLeft.setTextColor(textColorLeft); // Change text color of left layout

            RelativeLayout relLayoutRight = getActivity().findViewById(R.id.rel_layout_right); // Link variable to ID of right layout
            relLayoutRight.setBackgroundColor(backgroundColorRight); // Change background color of right layout
            TextView tvRight = getActivity().findViewById(R.id.tv_right); // Link variable to ID
            tvRight.setTextColor(textColorRight); // Change text color of right layout
            super.onActivityCreated(savedInstanceState);
        }
    }

Page_2.java (Действие 1 -> Фрагмент 2):

package com.example.konstantin.clipcodes_swiping;
    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.RelativeLayout;

    import static android.content.Context.MODE_PRIVATE;

    public class Page_2 extends Fragment
    {
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            View PageTwo = inflater.inflate(R.layout.page2, container, false);
            Button buttonLeft = PageTwo.findViewById(R.id.button_left);  // Link variable to ID of left button
            buttonLeft.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    int pos = 1; // Set position to left
                    setPosition(pos); // Load setColor method and send 2 color values
                }
            });
            Button buttonRight = PageTwo.findViewById(R.id.button_right);  // Link variable to ID of right button
            buttonRight.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    int pos = 2; // Set position to right
                    setPosition(pos); // Load setColor method and send 2 color values
                }
            });
            return PageTwo;
        }
        public void setPosition (int pos) // Start second activity to choose colors
        {
            Intent intentPos = new Intent(getActivity(), Page_4_Colors.class); // Create intent for current Activity and target activity
            SharedPreferences prefs = getActivity().getSharedPreferences("bgColor", Context.MODE_MULTI_PROCESS); // Create new SharedPreferences instance
            SharedPreferences.Editor editor = prefs.edit(); // Assign variable to editor function
            editor.putInt("position", pos); // Write selected position (int) inside of editor
            editor.apply(); // Save values, close process
            getActivity().startActivity(intentPos); // Start second activity
        }
    }

Page_3.java (Действие 1 -> Фрагмент 3):

        import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;

    public class Page_3 extends Fragment
    {
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            View PageThree = inflater.inflate(R.layout.page3, container, false);
            return PageThree;
        }
    }

Page_4_Colors.java (Действие 2):

        import android.app.Activity;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;

    public class Page_4_Colors extends Activity
    {
        int pos;
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.page4_colors);
            SharedPreferences prefs = getSharedPreferences("bgColor", MODE_MULTI_PROCESS); // Load saved shared file
            pos = prefs.getInt("position", pos); // Load saved position (int)
            Log.wtf("Position", String.valueOf(pos)); // Show pos value in Log
            Button buttonWhite = findViewById(R.id.button_white);
            buttonWhite.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    setColor(getResources().getColor(R.color.white), getResources().getColor(R.color.black)); // Load setColor method and send 2 color values
                }
            });
            Button buttonYellow = findViewById(R.id.button_yellow);
            buttonYellow.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    setColor(getResources().getColor(R.color.yellow), getResources().getColor(R.color.black)); // Load setColor method and send 2 color values
                }
            });
            Button buttonOrange = findViewById(R.id.button_orange);
            buttonOrange.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    setColor(getResources().getColor(R.color.orange), getResources().getColor(R.color.black)); // Load setColor method and send 2 color values
                }
            });
            Button buttonRed = findViewById(R.id.button_red);
            buttonRed.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    setColor(getResources().getColor(R.color.red), getResources().getColor(R.color.black)); // Load setColor method and send 2 color values
                }
            });
            Button buttonGreen = findViewById(R.id.button_green);
            buttonGreen.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    setColor(getResources().getColor(R.color.green), getResources().getColor(R.color.black)); // Load setColor method and send 2 color values
                }
            });
            Button buttonBlue = findViewById(R.id.button_blue);
            buttonBlue.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    setColor(getResources().getColor(R.color.blue), getResources().getColor(R.color.white)); // Load setColor method and send 2 color values
                }
            });
        }
        public void setColor (int backgroundColor, int textColor) // Write color values into SharedPreferences
        {
            SharedPreferences prefs = getSharedPreferences("bgColor", MODE_MULTI_PROCESS); // Create new SharedPreferences instance
            SharedPreferences.Editor editor = prefs.edit(); // Assign variable to editor function
            if (pos == 1)
            {
                editor.putInt("backgroundColorLeft", backgroundColor); // Write background color (int) inside of editor
                editor.putInt("textColorLeft", textColor); // Write text color (int) inside of editor
            }
            if (pos == 2)
            {
                editor.putInt("backgroundColorRight", backgroundColor); // Write background color (int) inside of editor
                editor.putInt("textColorRight", textColor); // Write text color (int) inside of editor
            }
            editor.apply(); // Save values, close process
            this.finish(); // Close this activity
        }
    }

Спасибо за любую помощь!

так вы хотите обновлять цвет сразу при его изменении?

Badran 22.08.2018 14:59

в первом фрагменте, который вы написали в onActivityCreated, вырезать вставку в onResume ()

Vishal Thakkar 22.08.2018 15:00

Извините @VishalThakkar, я не прочитал ваш ответ, когда писал свой ответ.

TibiG 22.08.2018 15:07

Ого, это действительно решило проблему! Спасибо! Мне вообще нужен onActivityCreated?

Stefan M. 23.08.2018 12:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
227
3

Ответы 3

Вы можете обновить пользовательский интерфейс (или, по крайней мере, часть, связанную с цветом) для каждого фрагмента в методе onResume (), таким образом, когда вы вернетесь из второго действия, он обновится.

Спасибо. Я предполагаю, что в этом случае я должен добавить onResume внутри Page_2.java? Поэтому каждый раз, когда я закрываю Acitivity 2 (и автоматически возвращаюсь на страницу_2), он будет выполнять метод onResume. Я сделал тест с помощью: Log.wtf ("test", "Fragment2 loaded"); и да, это сработало. Но я точно не знаю, что я должен опубликовать внутри этого метода.

Stefan M. 23.08.2018 12:22

что вы написали в onActivityCreated, как сказал @Vishal Thakkar

TibiG 27.08.2018 15:15

используйте EventBus

отменить регистрацию и зарегистрировать EventBus в Page_1 onStop() и onStart()

 EventBus.getDefault().unregister(this)

 EventBus.getDefault().register(this)

и используйте это для публикации значения

EventBus.getDefault().post(new MessageEvent("Change Color"));

и эта функция будет обрабатывать MessageEvent

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
    //change the color here
    //add this function in Page_1 
}

при обновлении значения цвета. положить в MessageEvent документация

Когда фрагмент становится видимым (т. Е. Выбранная страница в вашем ViewPager), вызывается его метод setUserVisibleHint (). Вы можете переопределить этот метод в своем фрагменте и использовать его для запуска обновления.

 @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser){
         //you can check if the color is changed then refresh the fragment if not then don't do anything
         //here you should refresh your fragment , this will called every time you
         //view this fragment in all cases even if you didn't move to the 
         //third tab 
        }
    }

Как обновить фрагмент

    Fragment currentFragment = getFragmentManager().findFragmentByTag("YourFragmentTag");
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    fragmentTransaction.detach(currentFragment);
    fragmentTransaction.attach(currentFragment);
    fragmentTransaction.commit();

это работает, однако метод будет вызван после завершения прокрутки окна просмотра. Так он будет видеть старый цвет, пока прокрутка не закончится, а потом изменит цвет :)

TibiG 22.08.2018 16:33

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

Badran 22.08.2018 17:00

Ты прав. Но он не должен вставлять код в if (isVisibleToUser), который будет вызываться только тогда, когда фрагмент виден.

TibiG 22.08.2018 20:27

ты прав ! хороший момент, но он может сделать простую проверку, например, если цвет изменился, обновите, если нет, то ничего не делайте

Badran 22.08.2018 20:29

Спасибо за это предложение. Хорошо, я попробовал, но пока безуспешно. Я создал общедоступную статическую финальную строку PAGE_1_FRAGMENT = "page_1_fragment"; внутри моей страницы Page_1.java и добавил в нее общедоступный void setUserVisibleHint (boolean isVisibleToUser). Затем я добавил ваш код «как обновить фрагмент» и изменил «YourFragmentTag» на PAGE_1_FRAGMENT. Я также пробовал "page_1_fragment", но это не сработало. Приложение вылетает, как только я его запускаю.

Stefan M. 23.08.2018 12:18

вы должны добавить тег по-другому, а не так

Badran 23.08.2018 12:24

Другие вопросы по теме