Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用片段和ViewPager的良好实践 问题描述_Java_Android_Android Fragments - Fatal编程技术网

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();