我设法编写了一个实际上非常简单的方法,并且不需要使 ListViews 或任何可能的情况无效。此方法调用public ViewGroup removeView(View view)、View requestLayout()、View forceLayout()、ViewGroup addView(View view),最后调用Fragment OnCreate(Bundle savedInstanceState) 方法并进行一些空检查和一个final View 临时变量来存储实际视图视图被移除。
这种方法仍然很新,我将在接下来的 2 天内对其进行一些调整和改进,但它可以完美地工作,没有任何副作用。由于我编写的包含代码的类更改了整个 rom 的实际首选项标题和摘要文本样式(这是我添加的选项的重点),我还添加了一个公共构造函数,这些类是位于首选项样式屏幕下方的活动堆栈中的活动,因此可以同时更新它们。我很可能会将这个新方法移到框架视图类中,以便在系统范围内使用它。
public void reLoadView(View view) {
if (view == null) {
view = mView;
Log.i(TAG, "The current View is: " + view);
}
final View tmpView = view;
try {
setStyleChanged(1);
setReset(0);
Log.i(TAG, "The Temporary View is: " + tmpView);
Log.i(TAG, "The current View is: " + mView);
Log.i(TAG, "The current ViewGroup is: " + mViewGroup);
if (mView != null) {
if (mViewGroup != null) {
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mViewGroup.removeView(mView);
mView.requestLayout();
mView.forceLayout();
mViewGroup.addView(tmpView);
onCreate(new Bundle());
}
});
}
}
View tmp = null;
mDemented.reLoadView(tmp);
} catch (Exception e) {
}
}
视图变量本身最初在类初始化中设置,并在View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) 和View onViewCreated(View view, Bundle savedInstanceState) 中初始化和定义。视图变量本身最初是在类初始化中设置的。
private View mView;
private ViewGroup mViewGroup;
private int mLayoutResId = R.layout.preference_list_fragment;//holds the layout reference just to keep it clean
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
View rootView = inflater.inflate(mLayoutResId, parent, false);
mViewGroup = parent;
return rootView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
mView = view;
}
在下面堆栈中的活动中,我的 PreferenceStyle 类,我设置了一个空的构造函数,它可以在应用程序的任何地方初始化。
public class DEMENTED extends SettingsPreferenceFragment implements
Preference.OnPreferenceChangeListener, View.OnClickListener {
public DEMENTED() {
super();
}
//other code to do whatever here
在我的 PreferenceStyle 类中,我导入了我的 DEMENTED 类,然后将其设置为 onCreate(Bundle savedInstanceState) 之前的变量:
private DEMENTED mDemented;
然后初始化onCreate(Bundle savedInstanceState)中的变量:
mDemented = new DEMENTED();
调用我的 DEMENTED 类以重新加载其视图是在我的 reloadView(View view) 方法中完成的,但用于进行调用的变量视图是在调用之前立即设置的视图变量并设置为 null:
View tmp = null;
mDemented.reLoadView(tmp);
我的 DEMENTED 类检查方法调用中包含的 View 是否为 null,如果是,则将其设置为本地化 View 变量,以便该方法可以使用局部变量进行工作:
public void reLoadView(View view) {
if (view == null) {
view = mView;
Log.i(TAG, "The current View is: " + view);
}
//all the other good stuff here
基本上,这使用 onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) 中定义的 ViewGroup:
mViewGroup = parent;
View 变量设置在onViewCreated(View view, Bundle savedInstanceState)
mView = view;
希望这对某人有所帮助,因为这是我在这里一遍又一遍地看到的一个问题,而且我基本上还没有在不涉及用作实用程序的多个类的任何地方找到一个可靠的解决方案。如果有人有任何意见建议以简化或任何意见,请随时发表评论。