Java 使用片段和ViewPager的良好实践 问题描述
我正在编写一个应用程序,它使用Java 使用片段和ViewPager的良好实践 问题描述,java,android,android-fragments,Java,Android,Android Fragments,我正在编写一个应用程序,它使用fragments和ViewPager在下面你可以看到我的FragmentPagerAdapter。我只是想知道写碎片页面编辑器是否正确?因为在某些情况下,当我在片段中调用getActivity()时,它返回null public class FragmentAdapter extends FragmentPagerAdapter { /* Fragments */ private Fragments[] mFragments; /** * Construct
fragments
和ViewPager
在下面你可以看到我的FragmentPagerAdapter
。我只是想知道写碎片页面编辑器
是否正确?因为在某些情况下,当我在片段中调用getActivity()
时,它返回null
public class FragmentAdapter extends FragmentPagerAdapter {
/* Fragments */
private Fragments[] mFragments;
/**
* Constructor.
* @param fm
*/
public FragmentAdapter(FragmentManager fm) {
super(fm);
/* Initialize Fragments. */
mFragments = Fragments.values();
}
public enum Fragments {
Favorites(App.getStringByResId(R.string.favorites), new FragmentFavorites()),
Categories(App.getStringByResId(R.string.categories), new FragmentCategories()),
YellowPages(App.getStringByResId(R.string.yellow_pages), new FragmentYellowPages());
/**
* Constructor.
* @param title Fragment title.
* @param fragment Fragment object.
*/
Fragments(String title, BaseListFragment fragment) {
this.mTitle = title;
this.mFragment = fragment;
}
/* Fragment Title Text. */
private String mTitle;
/* Fragment */
private BaseListFragment mFragment;
/**
* Get Fragment Title.
* @return Title.
*/
public String getTitle() {
return mTitle;
}
/**
* Get Fragment
* @return Fragment.
*/
public BaseListFragment getFragment() {
return mFragment;
}
};
@Override
public CharSequence getPageTitle(int position) {
return mFragments[position].getTitle();
}
@Override
public Fragment getItem(int position) {
return mFragments[position].getFragment();
}
@Override
public int getCount() {
return mFragments.length;
};
};
编辑
从主要活动中,我称之为代码。对吗?在大多数情况下,在本例中getActivity()
返回null
/* Call Search function for the given fragment. */
Fragments.values()[tabControl.getCurrentItem()].getFragment().search(tv.getText().toString());
碎片
公共类FragmentFavorites扩展了BaseListFragment{
最终静态字符串标记=FragmentFavorites.class.getSimpleName();
/*控制器*/
列表视图;
TextView-tvInfo;
/*简单游标适配器*/
单纯形适配器;
/*此成员保持当前数据库语言,每次调用onResume方法时
*应用程序必须检查数据库语言是否已更改,应用程序的语言是否已更改
*必须通过创建新适配器更新列表视图*/
字符串语言;
/*此标志显示已添加新收藏夹,并且需要更新列表*/
布尔值newFavoriteAdded=false;
布尔值canUpdateOnSearch=false;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
查看收藏夹SpagesView=充气机。充气(R.layout.fragment\u收藏夹,容器,false);
Log.i(标记“onCreateView()”);
/*初始化控制器*/
tvInfo=(TextView)favoritesPagesView.findViewById(R.id.tvNoFavoritesText);
lvFavorites=(ListView)favoritesPagesView.findViewById(android.R.id.list);
返回favoritesPagesView;
}/*onCreateView(布局充气机、视图组容器、捆绑包保存状态)*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.i(标记“onCreate()”);
/*告诉框架尽量保留这个片段
在配置更改期间*/
setRetainInstance(真);
/*获取上下文,如果上下文为空,则设置默认语言“英语”*/
final Context=getActivity();
if(上下文!=null){
wtf(标记“onCreate(上下文为null,设置默认语言\“en\”);
/*第一次创建片段时设置语言,默认语言为“英语”*/
SharedReferences首选项=PreferenceManager.GetDefaultSharedReferences(上下文);
语言=preferences.getString(preferences.language,preferences.EN);
}
else语言=Preferences.EN;
}/*onCreate(Bundle savedInstanceState)*/
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
Log.i(标记“onActivityCreated()”);
ListView ListView=getListView();
/*在项目上设置单击侦听器*/
setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView AdapterView,视图v,内部位置,长id){
游标游标=(游标)adapterView.getAdapter().getItem(位置);
最后一个字符串_id=cursor.getString(cursor.getColumnIndex(“_id”));
Log.i(标记“onItemClick”(_id=“+_id+”));
/*获取当前选定的语言*/
最终SharedReferences首选项=PreferenceManager.GetDefaultSharedReferences(getActivity());
最终字符串lang=preferences.getString(preferences.LANGUAGE,“en”);
ActionDialog=新建ActionDialog(getActivity());
setFavoriteRemovedListener(新的OnActionDialogListeners(){
@凌驾
在FavoriteRemoved()上的公共无效{
/*如果在Resume上没有收藏夹返回表单,则从首选项中获取保存的收藏夹*/
最终字符串收藏夹=preferences.getString(preferences.FAVORITE,null);
/*使用新的收藏夹联系人更新收藏夹适配器*/
UpdateAdapterIneed(lang、favorites、true);
}
@凌驾
public void onFavoriteAdded(){/*未使用…*/}
});
setID(_id);
setDeleteFavorite(true);
setTitle(cursor.getString(cursor.getColumnIndex(String.format(“name_%s”,language)));
setPhone(cursor.getString(cursor.getColumnIndex(“电话”));
dialog.show();
}
});
}/*onActivityCreated(Bundle savedInstanceState)*/
@凌驾
恢复时公开作废(){
super.onResume();
Log.i(标记“onResume()”);
/*检查数据库当前语言是否已更改*/
SharedReferences preferences=PreferenceManager.GetDefaultSharedReferences(getActivity());
最终字符串currentLanguage=preferences.getString(preferences.LANGUAGE,preferences.EN);
/*如果在Resume上没有收藏夹返回表单,则从首选项中获取保存的收藏夹*/
最终字符串收藏夹=preferences.getString(preferences.FAVORITE,null);
如果(收藏夹==null | |收藏夹.length()==0){
/*隐藏列表视图和显示文本视图*/
i(标记“首选项中没有保存的收藏夹”);
lvFavorites.setVisibility(View.GONE);
tvInfo.setVisibility(View.VISIBLE);
tvInfo.setText(getActivity().getString(R.string.no_selected_favorites));
回来
}
if(!currentLanguage.equalsIgnoreCase(语言)){
Log.i(标记“onResume(数据库语言已更改)”;
/*用更改的语言更新语言*/
语言=当前语言;
public class FragmentFavorites extends BaseListFragment {
final static String TAG = FragmentFavorites.class.getSimpleName();
/* Controllers. */
ListView lvFavorites;
TextView tvInfo;
/* Simple Cursor Adapter. */
SimpleCursorAdapter scAdapter;
/* This member keep current database language, every time then onResume method called
* application must check if database language was changed, if language changed application
* must update list view by creating new adapter. */
String language;
/* This flag shows that new favorite was added and list need to be updated. */
boolean newFavoriteAdded = false;
boolean canUpdateOnSearch = false;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View favoritesPagesView = inflater.inflate(R.layout.fragment_favorites, container, false);
Log.i(TAG, "onCreateView( )");
/* Initialize Controllers. */
tvInfo = (TextView) favoritesPagesView.findViewById(R.id.tvNoFavoritesText);
lvFavorites = (ListView) favoritesPagesView.findViewById(android.R.id.list);
return favoritesPagesView;
} /* onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate( )");
/* Tell the framework to try to keep this fragment around
during a configuration change. */
setRetainInstance(true);
/* Get context, if context is null set default language "English". */
final Context context = getActivity();
if (context != null) {
Log.wtf(TAG, "onCreate(Context is null, set default language \"en\".)");
/* Set language when fragment first created, default language is "English". */
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
language = preferences.getString(Preferences.LANGUAGE, Preferences.EN);
}
else language = Preferences.EN;
} /* onCreate(Bundle savedInstanceState) */
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.i(TAG, "onActivityCreated( )");
ListView listView = getListView();
/* Set on item click listener */
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View v, int position, long id) {
Cursor cursor = (Cursor)adapterView.getAdapter().getItem(position);
final String _id = cursor.getString(cursor.getColumnIndex("_id"));
Log.i(TAG, "onItemClick(_id = " + _id + ")");
/* Get current selected language. */
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
final String lang = preferences.getString(Preferences.LANGUAGE, "en");
ActionDialog dialog = new ActionDialog(getActivity());
dialog.setFavoriteRemovedListener(new OnActionDialogListeners() {
@Override
public void onFavoriteRemoved() {
/* Get Saved favorites from the preferences, if there are no favorites return form onResume. */
final String favorites = preferences.getString(Preferences.FAVORITE, null);
/* Update favorites adapter with new favorite contacts. */
updateAdapterIfNeeded(lang, favorites, true);
}
@Override
public void onFavoriteAdded() { /* Not used... */ }
});
dialog.setID(_id);
dialog.setDeleteFavorite(true);
dialog.setTitle(cursor.getString(cursor.getColumnIndex(String.format("name_%s", language))));
dialog.setPhone(cursor.getString(cursor.getColumnIndex("telephones")));
dialog.show();
}
});
} /* onActivityCreated(Bundle savedInstanceState) */
@Override
public void onResume() {
super.onResume();
Log.i(TAG, "onResume( )");
/* Check if database current language was changed. */
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
final String currentLanguage = preferences.getString(Preferences.LANGUAGE, Preferences.EN);
/* Get Saved favorites from the preferences, if there are no favorites return form onResume. */
final String favorites = preferences.getString(Preferences.FAVORITE, null);
if (favorites == null || favorites.length() == 0) {
/* Hide List View and show Text View. */
Log.i(TAG, "There are no saved favorites in the preferences.");
lvFavorites.setVisibility(View.GONE);
tvInfo.setVisibility(View.VISIBLE);
tvInfo.setText(getActivity().getString(R.string.no_selected_favorites));
return;
}
if (!currentLanguage.equalsIgnoreCase(language)) {
Log.i(TAG, "onResume(Database language was changed.)");
/* Update language with changed one. */
language = currentLanguage;
/* Update Adapter, do not pay attention if it is already created or no. */
updateAdapterIfNeeded(currentLanguage, favorites, true);
}
else if (newFavoriteAdded) {
Log.i(TAG, "onResume(New favorite was added to the list, update needed");
/* Update adapter as new favorite was added. */
updateAdapterIfNeeded(currentLanguage, favorites, true);
newFavoriteAdded = false;
}
else {
/* Update Adapter only in the case if no adapter is created (This will create new adapter) */
updateAdapterIfNeeded(currentLanguage, favorites, false);
}
} /* void onResume() */
/**
* This function update Simple Cursor Adapter in the case if it is needed or
* cursor adapter is not created yet.
*
* @param currentLanguage Current language of database.
* @param forceUpdate if true adapter will be updated in any case; otherwise it will
* not be updated.
*/
void updateAdapterIfNeeded(final String lang, final String favs, final boolean forceUpdate) {
Log.i(TAG, String.format("updateAdapterIfNeeded(%s, %b)", lang, forceUpdate));
/* Show "Favorites" list view and hide Info text view. */
lvFavorites.setVisibility(View.VISIBLE);
tvInfo.setVisibility(View.GONE);
if (forceUpdate || scAdapter == null) {
/* Preparing Adapter Settings. */
final int[] to = new int[]{ R.id.tvContactTitle, R.id.tvContactTelephone };
final String[] from = new String[] { String.format("name_%s", lang), "telephones" };
/* Get Contacts from the SQLite Database. */
final Cursor cursor = DataBaseManager.instance().getAllFavorites(favs, lang);
Log.i(TAG, "updateAdapterIfNeeded(Creating new Adapter ...)");
/* Create New Simple Cursor Adapter, even if it is already exists. */
scAdapter = new FragmentCursorAdapter(getActivity(), R.layout.contact_row, cursor, from, to, 0);
Log.i(TAG, "updateAdapterIfNeeded(Adapter was successfully created ...)");
/* Set Adapter to the list. */
this.setListAdapter(scAdapter);
}
} /* updateAdapterIfNeeded(final String currentLanguage, boolean forceUpdate) */
void updateAdapterOnSearch(final String tts, final String lang, final String favs) {
Log.i(TAG, String.format("updateAdapterOnSearch(%s, %s)", tts, lang));
/* Show "Favorites" list view and hide Info text view. */
lvFavorites.setVisibility(View.VISIBLE);
tvInfo.setVisibility(View.GONE);
/* Preparing Adapter Settings. */
final int[] to = new int[]{ R.id.tvContactTitle, R.id.tvContactTelephone };
final String[] from = new String[] { String.format("name_%s", lang), "telephones" };
/* Get Contacts from the SQLite Database. */
final Cursor cursor = DataBaseManager.instance().getSearchedFavorites(favs, lang, tts);
if (cursor.getCount() == 0) {
lvFavorites.setVisibility(View.GONE);
tvInfo.setVisibility(View.VISIBLE);
tvInfo.setText(String.format(getActivity().getString(R.string.no_companies_were_found), tts));
}
Log.i(TAG, "updateAdapterOnSearch(Creating new Adapter ...)");
/* Create New Simple Cursor Adapter, even if it is already exists. */
scAdapter = new FragmentCursorAdapter(getActivity(), R.layout.contact_row, cursor, from, to, 0);
Log.i(TAG, "updateAdapterOnSearch(Adapter was successfully created ...)");
/* Set Adapter to the list. */
this.setListAdapter(scAdapter);
} /* updateAdapterOnSearch(final String tts, final String lang) */
@Override
public void search(final String tts) {
final Context context = getActivity();
Log.i(TAG, String.format("search(%s)", tts));
/* Get application context. */
if (context == null) {
Log.wtf(TAG, "search(Search can't be completed as context is null)");
return;
}
/* Get Database current language. */
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
if (preferences == null) {
Log.w(TAG, "search(Search can't be completed as preferences object is null)");
return;
}
/* Get language from the preferences */
final String lang = preferences.getString(Preferences.LANGUAGE, Preferences.EN);
/* Get Saved favorites from the preferences, if there are no favorites return form onResume. */
final String favorites = preferences.getString(Preferences.FAVORITE, null);
/* If user search for the text. */
if (tts != null && tts.length() != 0) {
updateAdapterOnSearch(tts, lang, favorites);
canUpdateOnSearch = true;
}
if ((tts == null || tts.length() == 0) && canUpdateOnSearch) {
/* In this case all contacts will be shown in the list view. */
updateAdapterIfNeeded(lang, favorites, true);
canUpdateOnSearch = false;
}
} /* search(final String tts) */
public void newFavoriteAdded(final boolean value) {
Log.i(TAG, String.format("newFavoriteAdded(%b)", value));
newFavoriteAdded = value;
}
};
new Thread() {
@Override
public void run() {
// long operations goes here
// user decided to close fragment
Activity activity = getActivity();
// here 'activity' is null because fragment is destroyed
}
}.start();