android - 如何制作一个刷新抽屉中 fragment 的Android刷新按钮?

标签 android android-fragments

我正在尝试根据用户所在的抽屉刷新 fragment ...

这是我的尝试,它什么也没做,但没有给我一个错误。

这是我的代码

public void fragmentRefresh() {
        // Insert the fragment by replacing any existing fragment
        FragmentManager fragmentManager = getFragmentManager();

            fragmentManager.beginTransaction()
                    .replace(R.id.frame_container, fragmentManager.findFragmentByTag("TagForRefresh"))
                    .commit();


    }

抽屉 fragment 代码如下:

/**
     * Diplaying fragment view for selected nav drawer list item
     */
    private void displayView(int position) {
        // update the main content by replacing fragments
        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new HomeFragment();
                break;
            case 1:
                fragment = new BrowseFragment();
                break;
            case 2:
                fragment = new InviteFragment();
                break;
            case 3:
                fragment = new ProfileFragment();
                break;
            case 4:
                fragment = new SettingsFragment();
                break;
            case 5:
                callConfirmLogout();
                break;


            default:
                break;
        }

        if (fragment != null) {
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.frame_container, fragment, "TagForRefresh").commit();

            // update selected item and title, then close the drawer
            mDrawerList.setItemChecked(position, true);
            mDrawerList.setSelection(position);
            setTitle(navMenuTitles[position]);
            mDrawerLayout.closeDrawer(mDrawerList);
        } else {
            // error in creating fragment
            Log.e("MainActivity", "Error in creating fragment");
        }

在选项卡滑动器 fragment 类中实现:

public class ViewVotesActivity extends FragmentActivity implements ActionBar.TabListener{


    //Tab options
    private ViewPager viewPager;
    private TabSwipeAdapter mAdapter;
    private ActionBar actionBar;

    // Tab titles
    private String[] tabs = { "Created", "Up", "Down"};
    //for custom menu to add progress bar to refresh
    private MenuItem menuItem;

    //Search view action bar
    private SearchView search_action_bar;

    //getApplicationContext().getString(R.string.created),getApplicationContext().getString(R.string.upvote), getApplicationContext().getString(R.string.downvote)
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_votes);


        // Initializing tab
        viewPager = (ViewPager) findViewById(R.id.pager);
        actionBar = getActionBar();
        mAdapter = new TabSwipeAdapter(getSupportFragmentManager(), new UserCreatedFragment(), new UserUpVotesFragment(),new UserDownVotesFragment());

        viewPager.setAdapter(mAdapter);
        actionBar.setHomeButtonEnabled(true);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        // Adding Tabs
        for (String tab_name : tabs) {
            actionBar.addTab(actionBar.newTab().setText(tab_name)
                    .setTabListener(this));
        }

        /**
         * on swiping the viewpager make respective tab selected
         * */
        /**
         * on swiping the viewpager make respective tab selected
         * */
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
                // on changing the page
                // make respected tab selected
                actionBar.setSelectedNavigationItem(position);
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        });


    }

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        // on tab selected
        // show respected fragment view
        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {

    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.home, menu);
        setupActions(menu);
        callSearchActionBar(menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar actions click
        switch (item.getItemId()) {
            case R.id.action_refresh:
                menuItem = item;
                menuItem.setActionView(R.layout.refresh_progress_bar);
                //menuItem.expandActionView();
                fragmentRefresh();

                TestTask task = new TestTask();
                task.execute("test");
                return true;
            case R.id.action_discover:
                addNewItem();
                return true;
            case R.id.action_search:
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    public void addNewItem() {
        // user redirect to register followup
        Intent createItemIntent = new Intent(ViewVotesActivity.this, CreateItemActivity.class);
        // Closing all the Activities
        createItemIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        // Add new Flag to start new Activity
        createItemIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        // Staring Login Activity
        startActivity(createItemIntent);
    }

    public void fragmentRefresh() {
//        // Insert the fragment by replacing any existing fragment
//        FragmentManager fragmentManager = getFragmentManager();
//
//        fragmentManager.beginTransaction()
//                .replace(R.id.frame_container, fragmentManager.findFragmentByTag("TagForRefresh"))
//                .commit();


    }


    private class TestTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {
            // Simulate something long running
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            menuItem.collapseActionView();
            menuItem.setActionView(null);
        }
    };

    public  void setupActions(Menu menu) {
        MenuItem refreshItem = menu.findItem(R.id.action_refresh);
        MenuItem discoverItem = menu.findItem(R.id.action_discover);

        if (isAlwaysExpanded()) {

        } else {
            refreshItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM
                    | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);

            discoverItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM
                    | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
        }

    }

    public void callSearchActionBar(Menu menu) {
        //find the menu item and set search view at the same time
        MenuItem searchItem = menu.findItem(R.id.action_search);

        search_action_bar
                = (SearchView)  searchItem.getActionView();

        if (isAlwaysExpanded()) {
            search_action_bar.setIconifiedByDefault(false);
        } else {
            searchItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM
                    | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
        }

        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        if (searchManager != null) {
            List<SearchableInfo> searchables = searchManager.getSearchablesInGlobalSearch();

            SearchableInfo info = searchManager.getSearchableInfo(getComponentName());
            for (SearchableInfo inf : searchables) {
                if (inf.getSuggestAuthority() != null
                        && inf.getSuggestAuthority().startsWith("applications")) {
                    info = inf;
                }
            }
            search_action_bar.setSearchableInfo(info);
        }

        search_action_bar.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            public boolean onQueryTextChange(String newText) {
                Log.e("Query = ", newText);
                return false;
            }

            public boolean onQueryTextSubmit(String query) {
                Log.e("Submit", "Submited " + query);
                // user redirect to register followup
                Intent searchIntent = new Intent(ViewVotesActivity.this, SearchActivity.class);

                searchIntent.putExtra("search", query);

                // Closing all the Activities
                searchIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                // Add new Flag to start new Activity
                searchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                // Staring Login Activity
                startActivity(searchIntent);
                return false;
            }

            public boolean onClose() {
                Log.e("query close", "query closingggg");
                return false;
            }
        });
    }
    protected boolean isAlwaysExpanded() {
        return false;
    }


}

最佳答案

更新: 看起来您正试图告诉 Activity 是时候根据 Navigation Drawer 中的选择更改内容 fragment 了。

这个问题有两个部分。

  1. 您需要提供一种从 Drawer 到 Activity 的通信机制,Activity 将继续执行必要的操作。
  2. 您的 fragment 必须被分离、销毁、重新创建和重新附加(效率低下,为什么?),或者简单地实现一种机制来告诉它们:嘿,是时候刷新您的内容了。

如果您只需要重置其数据,我看不出有任何理由需要完全销毁 fragment 的 View 。似乎是一个设计缺陷。

替换 Fragment 不应该意味着您要完全销毁它,因为用户可以简单地返回或按下最近删除的 Fragment。再次重新创建它是低效的。

正如我在评论中提到的,需要更多代码才能了解您当前的方法。

通常一个简单的界面(就像我在下面描述的那样)就足够了。您的 Activity 可以接收抽屉中的“点击”并决定替换哪个 fragment (如果需要)。

请更加具体并提供更多代码。


旧回复:

警告:如果您尝试替换当前 fragment ,请确保您没有收到错误的 FragmentManager。您执行 getFragmentManager(),但我确定您正在使用支持库,因此需要执行 getSupportFragmentManager();。 您没有提及您的目标版本,因此很难知道。

另一方面,

如果你想做的是告诉当前可见的 fragment 刷新......你应该使用更通用的方法来进行对象到对象的通信。

你把事情搞得太复杂了。

(警告:伪代码)

创建一个界面,如:

public interface Refreshable{
  void onShouldRefresh();
}

有一个 DrawerController 能够存储观察者/听众......

public class DrawerController {
    private List<Refreshable> mListeners = new ArrayList<Refreshable>();
    public void addRefreshListener(E listener) {
        if (listener != null && !mListeners.contains(listener)) {
            mListeners.add(listener);
        }
    }
    public void removeRefreshListener(E listener) {
        if (listener != null) {
            mListeners.remove(listener);
        }
    }
}

让你的 fragment 实现它(并在它们可见时订阅事件)

public class HomeFragment extends Fragment implements Refreshable {
    // your fragment code
    public void onShouldRefresh(){
         // do the refresh
    }
    @Override
    public void onResume() {
        super.onResume();
        yourDrawerController.addRefreshListener(this);
    }

    @Override
    public void onPause() {
        super.onPause();
        yourDrawerController.removeRefreshListener(this);
    }
}

现在创建一个方法,告诉感兴趣的各方(在本例中是您的“可刷新”对象)是时候刷新了,将其添加到您的 DrawerController 中……

public void refresh(){
    for (Refreshable listener : mListeners) {
        if (listener != null) {
            listener.onShouldRefresh();
        }
    }     
}

最后,在您的代码中,调用 refresh() 并喝杯啤酒。

我没听懂你的意思吗?我不是 100% 清楚。

关于android - 如何制作一个刷新抽屉中 fragment 的Android刷新按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22161436/

相关文章:

java - 从远程服务器访问依赖项

android - 为什么 fragment 类可能无效?

android - 嵌套的 ViewPager 在 onBackPressed() 上空白内容

android - 具有相同菜单、相同布局的 fragment 会导致重复的菜单项

android - 在 ViewPager 中输入动画

android - BroadcastReceiver 多久监听一次 Intents

android - 基于库的应用程序安装 2 个 APK 文件,而不是一个 - 为什么?

安卓界面设计

android - 如何在 Android 中覆盖 LiveData toString

android - fragment里面的private变量都是null,为什么?