单击按钮时更新/刷新片段



我创建了一个非常简单的测试应用程序,其中包括:

  • 2 个片段
  • 2 个按钮(在片段 1 中(
  • 1 个文本视图(在片段 2 中(
  • 两个片段的共享首选项
  • 一个ViewPager,可让您从片段1滑动到片段2,反之亦然

我的目标是每次我点击片段 1 中的特定按钮时, 片段 2 的文本视图已更新。

这有效,但是,我总是必须首先旋转显示,以便刷新片段/视图。

我在这里找到了一些线程,但似乎有很多不同的方法。

据我了解,一种方法是分离片段 2,更新它,然后再次附加它。

问题是:

我是否还必须修改片段 2 的代码,或者修改方法是否足够 在片段 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 java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity
{
ViewPager vp; // Variable for Viewpager
private static final String TAG = "MainActivity"; // Not sure if needed
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager vp = findViewById(R.id.vp); // Link variable to ID
SetUpViewPager(vp); // Run method
}
public void SetUpViewPager(ViewPager viewpage)
{
MyViewPagerAdapter Adapter = new MyViewPagerAdapter(getSupportFragmentManager());
Adapter.AddPageFragment(new Fragment1(), "Fragment1"); // Load page 1 inside of ViewPager
Adapter.AddPageFragment(new Fragment2(), "Fragment2"); // Load page 1 inside of ViewPager
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 2; // 2 pages total
}
}
}

片段 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.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
public class Fragment1 extends Fragment
{
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
View fragmentOne = inflater.inflate(R.layout.fragment1, container, false); // Link view and layout
Button button1 = fragmentOne.findViewById(R.id.button_1); // Link variable to ID
Button button2 = fragmentOne.findViewById(R.id.button_2); // Link variable to ID
button1.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
savePreferences("1");
}
});
button2.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
savePreferences("2");
}
});
return fragmentOne;
}
public void savePreferences(String text)
{
SharedPreferences prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", Context.MODE_PRIVATE); // Create new SharedPreferences instance
SharedPreferences.Editor editor = prefs.edit(); // Create variable for SharedPreferences
editor.putString("text", text); // Write text coming from button inside of editor
editor.apply(); // Apply and close SharedPreferences instance
Log.wtf("Text is: ", text); // Check if text is correct - yes, it's correct
}
}

片段2:

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.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class Fragment2 extends Fragment
{
String text; // Text which gets shown inside of TextView
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
View fragmentTwo = inflater.inflate(R.layout.fragment2, container, false); // Link view and layout
loadSharedPreferences(); // Load SharedPreferences
TextView textViewValue = fragmentTwo.findViewById(R.id.text_view); // Link variable to ID
textViewValue.setText(text); // Show loaded value
return fragmentTwo;
}
public void loadSharedPreferences()
{
SharedPreferences prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", Context.MODE_PRIVATE); // Load SharedPreferences
text = prefs.getString("text", "0"); // Retrieve text from Shared Preferences
}
}

编辑 - 20.09.18Fragment2 的第三版:

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.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class Fragment2 extends Fragment
{
String text;
private SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener;
private static final String STATE_TEXT = "state_text";
SharedPreferences prefs;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
View fragmentTwo = inflater.inflate(R.layout.fragment2, container, false); // Link view and layout
final TextView textViewValue = fragmentTwo.findViewById(R.id.text_view); // Link variable to ID
prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", Context.MODE_PRIVATE);
preferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener()
{
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
{
switch (key)
{
case "text":
String text = sharedPreferences.getString("text", "0");
textViewValue.setText(text);
break;
}
}
};
prefs.registerOnSharedPreferenceChangeListener(preferenceChangeListener);
return fragmentTwo;
};
@Override
public void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
outState.putString(STATE_TEXT, text);
}
@Override
public void onViewStateRestored(Bundle savedInstanceState)
{
super.onViewStateRestored(savedInstanceState);
text = savedInstanceState.getString(STATE_TEXT);
}
@Override
public void onDestroy()
{
super.onDestroy();
if (preferenceChangeListener != null)
{
prefs.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);
}
}
}

编辑 - 24.09.18

片段 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.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
public class Fragment1 extends Fragment
{
String text;
int bColor;
SharedPreferences prefs;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
View fragmentOne = inflater.inflate(R.layout.fragment1, container, false); // Link view and layout
Button button1 = fragmentOne.findViewById(R.id.button_1); // Link variable to ID
Button button2 = fragmentOne.findViewById(R.id.button_2); // Link variable to ID
Button buttonColorRed = fragmentOne.findViewById(R.id.button_color_red); // Link variable to ID
Button buttonColorBlue = fragmentOne.findViewById(R.id.button_color_blue); // Link variable to ID
prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", Context.MODE_PRIVATE);
bColor = prefs.getInt("bcolor", 0);
text = prefs.getString("text", "0");
button1.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
text = "1";
savePreferences();
}
});
button2.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
text = "2";
savePreferences();
}
});
buttonColorRed.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
bColor = getResources().getColor(R.color.red);
savePreferences();
}
});
buttonColorBlue.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
bColor = getResources().getColor(R.color.blue);
savePreferences();
}
});
return fragmentOne;
}
public void savePreferences()
{
SharedPreferences prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", Context.MODE_PRIVATE); // Create new SharedPreferences instance
SharedPreferences.Editor editor = prefs.edit(); // Create variable for SharedPreferences
editor.putString("text", text); // Write text coming from button inside of editor
editor.putInt("bcolor", bColor); // Write background color coming from button inside of editor
editor.apply(); // Apply and close SharedPreferences instance
Log.wtf("Text is: ", text); // Check if text is correct - yes, it's correct
}
}

片段2:

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.TextView;
public class Fragment2 extends Fragment
{
String text;
int bColor;
private SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener;
SharedPreferences prefs;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
View fragmentTwo = inflater.inflate(R.layout.fragment2, container, false); // Link view and layout
final TextView textViewValue = fragmentTwo.findViewById(R.id.text_view); // Link variable to ID
final ConstraintLayout constraintLayout = fragmentTwo.findViewById(R.id.constraint_layout);
prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", Context.MODE_PRIVATE);
text = prefs.getString("text", "0");
textViewValue.setText(text);
bColor = prefs.getInt("bcolor", 0);
constraintLayout.setBackgroundColor(bColor);
preferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener()
{
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
{
switch (key)
{
case "text":
text = sharedPreferences.getString("text", "0");
textViewValue.setText(text);
case "bcolor":
bColor = sharedPreferences.getInt("bcolor", getResources().getColor(R.color.white));
constraintLayout.setBackgroundColor(bColor);
break;
}
}
};
prefs.registerOnSharedPreferenceChangeListener(preferenceChangeListener);
return fragmentTwo;
};
@Override
public void onDestroy()
{
super.onDestroy();
if (preferenceChangeListener != null)
{
prefs.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);
}
}
}

任何帮助将不胜感激!

要取消注册侦听器,请将其设为全局变量。请尝试以下操作:

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.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class Fragment2 extends Fragment {
String text;
private SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener;
SharedPreferences prefs;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View fragmentTwo = inflater.inflate(R.layout.fragment2, container, false); // Link view and layout
final TextView textViewValue = fragmentTwo.findViewById(R.id.text_view); // Link variable to ID
prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", Context.MODE_PRIVATE);
preferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
switch (key)
{
case "text":
String text = sharedPreferences.getString("text", "0");
textViewValue.setText(text);
break;
}
}
};
prefs.registerOnSharedPreferenceChangeListener(preferenceChangeListener);
return fragmentTwo;
};
@Override
public void onDestroy() {
super.onDestroy();
if (preferenceChangeListener != null){
prefs.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);
}
}
}

请注意,当监听器被销毁时,侦听器将被取消注册Fragment2。这通常发生在选项卡布局中有三个片段并且您转到第三个选项卡时,第一个选项卡片段将被销毁,除非您在ViewPager中增加了屏幕外页面。

要解决此问题,请将文本设置为文本视图,从SharedPreferenceonCreateViewFragment2,以便在 ViewPager 中重新加载时它将更新。您现在不会注意到问题,但是如果您向ViewPager添加另一个选项卡,则可能会出现问题,这是解决方案。

最新更新