简体   繁体   English

编写SharedPreferences后更新布局?

[英]Update layout after writing SharedPreferences?

My first thread here - sorry if the text formatting is bad. 我的第一个主题-很抱歉,如果文本格式错误。

I use Android Studio 3.1.3 API27 and work on an app for Smartphone. 我使用Android Studio 3.1.3 API27,并在智能手机应用程序上工作。

The app currently consists of 1 activity (split in 3 fragments), a second activity and 5 xml files. 该应用程序当前包含1个活动(分为3个片段),第二个活动和5个xml文件。

By using a ViewPager, I'm able to swipe through the 3 fragments. 通过使用ViewPager,我可以在3个片段中滑动。

The 2nd fragment (middle fragment) contains 2 buttons that each open the 2nd activity, which contains many color buttons. 第二个片段(中间片段)包含2个按钮,每个按钮都会打开第二个活动,其中包含许多颜色按钮。

When clicking on the color buttons, I can change the background colors of the 1st fragment. 单击颜色按钮时,我可以更改第一个片段的背景颜色。

After choosing a color, the 2nd activity gets closed and I'm back in activity 1 -> fragment2. 选择颜色后,第二个活动关闭,我回到活动1-> fragment2。

It works, but the PROBLEM is that I always have to swipe to the 3rd fragment, then back to the 2nd and then to the 1st. 它可以工作, 但问题是我总是必须先滑动到第三个片段,然后再回到第二个片段,然后再回到第一个片段。

If I don't do this, the colors of fragment 1 will remain the old ones. 如果我不这样做,片段1的颜色将保持旧颜色。

Now I'm looking for a way to update the layout of fragment 1 as soon as I press a color button of activity 2. 现在,我正在寻找一种方法,可以在按下活动2的颜色按钮后立即更新片段1的布局。

I already tried this: 我已经试过了:

  • when writing the SharedPreferences (Activity2), I use editor.apply() instead of editor.commit() 在编写SharedPreferences(Activity2)时,我使用editor.apply()而不是editor.commit()
  • when reading the SharedPreferences (Activity1 -> Fragment1), I use Context.MODE_MULTI_PROCESS instead of Context.MODE_PRIVATE 在读取SharedPreferences(活动1-> Fragment1)时,我使用Context.MODE_MULTI_PROCESS而不是Context.MODE_PRIVATE
  • using viewpage.setOffscreenPageLimit(0); 使用viewpage.setOffscreenPageLimit(0); in the MainActivity inside of my public void SetUpViewPager(ViewPager viewpage) method. 在我的公共void SetUpViewPager(ViewPager viewpage)方法的MainActivity中。

Nothing helped, though. 但是,没有任何帮助。

This is how it looks like: 它是这样的:

这是它的外观(GIF动画):

MainActivity.java (Activity 1): 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 (Activity 1 -> Fragment 1): 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 (Activity 1 -> Fragment 2): 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 (Activity 1 -> Fragment 3): 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 (Activity 2): 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
        }
    }

Thanks for any help! 谢谢你的帮助!

您可以在onResume()方法中为每个片段更新UI(或至少与颜色相关的部分),因此,当您从第二个活动返回时,它将刷新。

use EventBus 使用EventBus

unregister and register EventBus in Page_1 onStop() and onStart() 在Page_1 onStop()onStart()注销并注册EventBus

 EventBus.getDefault().unregister(this)

 EventBus.getDefault().register(this)

and use this for post the value 并用它来发布值

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

and this function will handle the MessageEvent 这个函数将处理MessageEvent

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

when you update the value of color. 当您更新color的值时。 put in MessageEvent documentation 放入MessageEvent 文档

When a Fragment is made visible (ie, the selected page in your ViewPager), its setUserVisibleHint() method is called. 当片段变得可见时(即,ViewPager中的选定页面),将调用其setUserVisibleHint()方法。 You can override that method in your Fragment and use it to trigger a refresh. 您可以在Fragment中覆盖该方法,并使用它触发刷新。

 @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 
        }
    }

How To Refresh A Fragment 如何刷新片段

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM