【问题标题】:Same Fragments in FragmentPageAdapterFragmentPagerAdapter 中的相同片段
【发布时间】:2014-08-30 16:57:23
【问题描述】:

我正在 android 中开发一个 ExpenseManager 应用程序,我正在实现一个fragmentActivity。此fragment 显示帐户摘要页面,其中包含帐户余额、帐户最后交易金额和其他详细信息等详细信息。

AccountSummary Activity 是使用ViewPagerActionBarFragmentPageAdapterFragmentActivity 实现的多选项卡活动。

摘要页面的布局对于所有帐户都是通用的,只有数据会根据用户选择的帐户进行更改。

现在,我想实现这个活动,我可以在所有帐户或(ActionBar 选项卡)中重复使用/复制相同的 fragment 布局(不是实例)。当用户从actionBar 中选择任何选项卡时,它应该加载/显示/显示一个片段以及该帐户数据。

(我知道我需要创建具有不同TagName 的动态Fragment 并且需要在FragmentTransaction 的帮助下进行替换;由于某种原因,此解决方案不起作用)。

这类似于playstore 上的应用程序,应用程序布局为Url

有人可以使用示例代码发布解决方案吗?我一直在努力寻找解决方案,但似乎没有任何效果。

编辑

AccountSummaryTabActivity.java

public class AccountSummaryTabActivity extends FragmentActivity implements ActionBar.TabListener {

    ViewPager viewPager = null;
    ActionBar actionBar = null; 
    AccountSummaryTabAdapter accSummaryAdapter = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_account_summary_tab);

        DBHelper dbHelper = new DBHelper(getApplicationContext());
        RuntimeExceptionDao<Account, Integer> simpleAccountDao = dbHelper.getSimpleAccountDataDao();
        List<Account> accountList = simpleAccountDao.queryForAll();

        viewPager = (ViewPager)findViewById(R.id.accountSummaryPager);
        actionBar = getActionBar();
        accSummaryAdapter = new AccountSummaryTabAdapter(getSupportFragmentManager());
        accSummaryAdapter.setCount(accountList.size());

        viewPager.setAdapter(accSummaryAdapter);
        actionBar.setHomeButtonEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        

        String[] accountNameArr = new String[accountList.size()];
        Integer i=1;
        for (Account account : accountList) {

            if(account.getIsPrimaryAcc().equalsIgnoreCase("Y"))
                accountNameArr[0] = account.getName();
            else
                accountNameArr[i++] = account.getName();
        }

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

        Intent intent = getIntent();
        if(intent.getStringExtra("selectedAccNameTab")==null)
            intent.putExtra("selectedAccNameTab", accountNameArr[0]);

        viewPager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int arg0) {
                actionBar.setSelectedNavigationItem(arg0);
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
                // TODO Auto-generated method stub

            }
        });
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        System.out.println("onTabSelected "+tab.getText());

        DBHelper dbHelper = new DBHelper(getApplicationContext());
        RuntimeExceptionDao<Account, Integer> simpleAccountDao = dbHelper.getSimpleAccountDataDao();
        List<Account> accountList = simpleAccountDao.queryForAll();

        Intent intent = getIntent();
        intent.putExtra("selectedAccNameTab", tab.getText());

        accSummaryAdapter = new AccountSummaryTabAdapter(getSupportFragmentManager());
        accSummaryAdapter.setCount(accountList.size());
        viewPager.setAdapter(accSummaryAdapter);
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        System.out.println("onTabUnselected "+tab.getText());

    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        System.out.println("onTabReselected "+tab.getText());
    }
}

AccountSummaryTabAdapter.java

public class AccountSummaryTabAdapter extends FragmentPagerAdapter {

    FragmentManager fm=null;
    Integer count = 0;

    public AccountSummaryTabAdapter(FragmentManager fm) {
        super(fm);
        this.fm=fm;
    }

    public void setCount(Integer count){
        this.count=count;
    }

    @Override
    public Fragment getItem(int arg0) {

        switch (arg0){
            default :{

                AccountSummaryFragment fragment = new AccountSummaryFragment();
                return fragment;
            }
        }
    }

    @Override
    public int getCount() {
        return count;
    }
}

AccountSummaryFragment.java

public class AccountSummaryFragment extends Fragment {

    public AccountSummaryFragment() {
        super();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.activity_account_summary, container, false);

        String accountName = getActivity().getIntent().getStringExtra("selectedAccNameTab");

        DBHelper dbHelper = new DBHelper(getActivity());
        RuntimeExceptionDao<Account, Integer> simpleAccountDao = dbHelper.getSimpleAccountDataDao();
        List<Account> accountList = simpleAccountDao.queryForEq("name", accountName);

        Account defaultAcc = accountList.get(0);
        String[] accountNameArr = new String[]{"Monthly","Quaterly","Half Yearly","Yearly"};

        TextView balanceTxVw = (TextView) rootView.findViewById(R.id.accountBalanceTxVw);
        Double balance = defaultAcc.getBalance();
        DecimalFormat df = new DecimalFormat("0.00");
        balanceTxVw.setText(df.format(balance));

        Spinner dropdown = (Spinner)rootView.findViewById(R.id.graphSpinner);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, accountNameArr);
        dropdown.setAdapter(adapter);

        return rootView;
    }
}

activity_account_summary_tab.xml 布局文件

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/accountSummaryPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</android.support.v4.view.ViewPager>

提前致谢

【问题讨论】:

  • 你能发布你的代码吗?
  • 我在这里添加了代码。基本上我每次都会更改重新初始化适配器类,选择一个选项卡。这样我就可以获得 Tab Selected 帐户详细信息。但这对性能有一些影响,我可以在刷账户摘要片段时看到滞后

标签: android android-layout android-activity android-fragments android-tabs


【解决方案1】:

解决此问题的最可能方法是执行以下操作:

  • 由于大多数帐户的布局相同;
  • 您确实可以使用相同的片段,但是您应该跟踪选择了哪个选项卡。
  • 该选项卡 (int) 将被传递回 TabsPagerAdapter。下一步;
  • 基于该整数值,您应该返回相同的片段,但具有不同的 Extra 值 - 例如选项卡 2。
  • 在片段的 onAttach 中,您可以 getArguments() 或 extras 并打开它以获取该特定片段的正确数据。
  • 使用该特定整数获得正确值后,您可以将值分配给类变量 - 这意味着您应该将它们设为类级变量。

我希望这会有所帮助。告诉我进展如何。

【讨论】:

  • 嗯,片段的数量不是固定的。因为用户可以添加任意数量的帐户。并且适配器适用于固定数量的片段。我把代码贴在这里了,有修改的告诉我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 2013-09-13
  • 1970-01-01
相关资源
最近更新 更多