Мне удалось написать метод, который на самом деле довольно прост и не требует аннулирования ListViews или какой-либо другой ситуации.Этот метод выполняет вызов к public ViewGroup removeView(View view)
, View requestLayout()
, View forceLayout()
, ViewGroup addView(View view)
и, наконец, к вызову Fragment OnCreate(Bundle savedInstanceState)
методов с несколькими нулевыми проверками и временной переменной final View
для сохранения фактического представления, когдапредставление удалено.
Этот метод все еще довольно новый, и я буду давать ему некоторые настройки и уточнения в течение следующих 2 дней, но он работает без сбоев, как и без побочных эффектов.Так как класс, который я написал с кодом, изменяет фактический заголовок предпочтения и стили текста сводки для всего раздела (в этом и заключался весь смысл добавленных мной опций), я также добавил открытый конструктор классов, которыедействия, которые находятся в стеке действий под экраном стиля предпочтений, поэтому их можно обновлять одновременно.Скорее всего, я перенесу этот новый метод в класс представлений frameworks, чтобы его можно было сделать доступным для всей системы.
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)
, но представление переменной, используемое для вызова, является переменной View, установленной непосредственно перед вызовом и устанавливаемой как null:
View tmp = null;
mDemented.reLoadView(tmp);
и мой класс DEMENTED проверяет, является ли включенный View в вызове метода нулевым, и если да, устанавливает его в локализованную переменную 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
В основном, это использует ViewGroup, как определено в onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
:
mViewGroup = parent;
, а переменная View установлена в onViewCreated(View view, Bundle savedInstanceState)
mView = view;
Надеюсь, это кому-то поможетпотому что это был вопрос, который я неоднократно повторял здесь, и мне еще предстоит найти надежное решение практически везде, где бы не использовалось несколько классов, используемых в качестве утилит.Если у кого-либо есть предложения по упрощению комментариев или что-либо еще, не стесняйтесь комментировать.