【问题标题】:Passing data from Activity to Fragments将数据从 Activity 传递到 Fragments
【发布时间】:2014-10-07 20:14:38
【问题描述】:

我已经完成了一个简单的应用程序,通过 json 列出 mysql 数据库中的所有产品。当我单击特定产品时,它会将我带到显示其详细信息的活动。 现在我更改了我的应用程序,以便当我从列表中单击特定产品时,它会转到 3 个选项卡式片段。我已经创建了所有相关的片段,一切正常。仅当我尝试将列表中的所有产品活动中的数据传递给详细信息片段活动时,它才不起作用。如何将列出所有产品的主屏幕中的数据传递到显示详细信息的 3 个片段?

进一步解释:

没有框架的工作示例: 主要活动显示所有产品并在选择单个产品时将其传递给详细信息活动-> 详细信息活动从主要活动中获取数据并显示详细信息

现在我有了显示所有产品的主要活动。我是否将数据传递给 ->“public class EmpresaDetailsActivity extends FragmentActivity implements ActionBar.TabListener { etc”,还是必须将其传递给我创建的所有其他 3 个单个片段?

(旧方式)列出所有产品:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.all_empresas);

        empresaList = new ArrayList<HashMap<String, String>>();

        // Get listview
        ListView lv = getListView();

        // on selecting single empresa
        // launching Empresa Details Screen
        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                // getting values from selected ListItem
                String eid = ((TextView) view.findViewById(R.id.eid)).getText().toString();
                String marca = ((TextView) view.findViewById(R.id.marca)).getText().toString();
                String investimento = ((TextView) view.findViewById(R.id.investimento)).getText().toString();
                String marcatotal = ((TextView) view.findViewById(R.id.marcatotal)).getText().toString();

                // Starting new intent
                Intent in = new Intent(getApplicationContext(),EmpresaDetailsActivity.class);
                // sending data to next activity
                in.putExtra(TAG_EID, eid);
                in.putExtra(TAG_MARCA, marca);
                in.putExtra(TAG_INVESTIMENTO, investimento);
                in.putExtra(TAG_MARCATOTAL, marcatotal);

                // starting new activity and expecting some response back
                startActivity(in);
            }
        });

        // Loading empresa in Background Thread
        new LoadAllEmpresa().execute();
    }

(老办法)单品详情:

public class EmpresaDetailsActivity  extends Activity {

    // JSON node keys
    private static final String TAG_EID = "eid";
    private static final String TAG_MARCA = "marca";
    private static final String TAG_INVESTIMENTO = "investimento";
    private static final String TAG_MARCATOTAL = "marcatotal";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.details_empresa);

        // getting intent data
        Intent in = getIntent();

        // Get JSON values from previous intent
        String eid = in.getStringExtra(TAG_EID);
        String marca = in.getStringExtra(TAG_MARCA);
        String investimento = in.getStringExtra(TAG_INVESTIMENTO);
        String marcatotal = in.getStringExtra(TAG_MARCATOTAL);

        // Displaying all values on the screen
        TextView lblEid = (TextView) findViewById(R.id.showEid);
        TextView lblName = (TextView) findViewById(R.id.showMarca);
        TextView lblInvestimento = (TextView) findViewById(R.id.showInvestimento);
        TextView lblMarcatotal = (TextView) findViewById(R.id.showMarcaTotal);

        lblEid.setText(eid);
        lblName.setText(marca);
        lblInvestimento.setText(investimento);
        lblMarcatotal.setText(marcatotal);
    }
}

具有 3 个片段的新详细信息类:

public class EmpresaDetailsActivity extends FragmentActivity implements ActionBar.TabListener {

    private ViewPager viewPager;
    private TabsPagerAdapter mAdapter;
    private ActionBar actionBar;
    // Tab titles
    private String[] tabs = { "Apresentação", "Ficha Técnica", "Pedir Informação" };

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

        // Initilization
        viewPager = (ViewPager) findViewById(R.id.pager);
        actionBar = getActionBar();
        mAdapter = new TabsPagerAdapter(getSupportFragmentManager());

        viewPager.setAdapter(mAdapter);
        actionBar.setHomeButtonEnabled(false);
        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
         * */
        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 onTabReselected(Tab tab, FragmentTransaction ft) {
    }

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

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    }

}

TabsPagerAdapter 类:

public class TabsPagerAdapter extends FragmentPagerAdapter {

    public TabsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int index) {

        switch (index) {
        case 0:
            // Top Rated fragment activity
            return new ApresentacaoFragment();
        case 1:
            // Games fragment activity
            return new FichaTecnicaFragment();
        case 2:
            // Movies fragment activity
            return new PedirInformacaoFragment();
        }

        return null;
    }

    @Override
    public int getCount() {
        // get item count - equal to number of tabs
        return 3;
    }

}

3 个片段中的 1 个片段的示例:

public class ApresentacaoFragment extends Fragment {

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

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

        return rootView;
    }
}

【问题讨论】:

标签: android android-fragments


【解决方案1】:

在您的活动 onItemClick() 上,在启动片段之前:

Bundle args = new Bundle();
args.putString(TAG_EID, eid);
args.putString(TAG_MARCA, marca);
args.putString(TAG_INVESTIMENTO, invetstimento);
args.putString(TAG_MARCATOTLA, marcatotal);
yourFragment.setArguments(args);

在您的片段 OnCreateView() 上:

Bundle args = getArguments();
String marca = args.getString(TAG_MARCA);
// and so on...

更清楚地说,这里是您应该如何在活动/片段之间传递数据。

  • 活动 --> 片段:使用 Bundle 和 setArguments。 (如上图)
  • Activity --> Activity : 使用 Intent 和 putExtra。
  • 片段 --> 活动:使用接口。 Avtivity 应该实现它,Fragment 应该调用它。

检查您的新代码后:

  1. 将您的字符串包装在一个 Bundle 中,并将其从 MainActivity 传递给您的 EmpresaDetailsActivity。
  2. 使用 getIntent().getExtras() 从那里获取它。
  3. 将您的 TabsPagerAdapter 更改为:

    public class TabsPagerAdapter extends FragmentPagerAdapter {
    
    private Bundle args;
    
    public TabsPagerAdapter(FragmentManager fm, Bundle args) {
        super(fm);
        this.args = args;
    }
    
    @Override
    public Fragment getItem(int index) {
    
    switch (index) {
    case 0:
        // Top Rated fragment activity
        ApresentacaoFragment apresentacaoFragment = new ApresentacaoFragment();
        apresentacaoFragment.setArguments(args);
        return apresentacaoFragment;
    case 1:
        // Games fragment activity
        // do the same as above with your Games fragmnet class
    case 2:
        // Movies fragment activity
        // ...
    }
    
    return null;
     }
    
     @Override
    public int getCount() {
        // get item count - equal to number of tabs
        return 3;
    }   
    }
    
    1. 实例化适配器时,将包传递给其构造函数。
    2. 在您的片段类中使用 getArguments() 来获取包,然后您就完成了。

【讨论】:

  • 只是为了澄清(因为我刚刚开始使用片段来让自己了解最新情况)当我在我的活动中拥有所有产品的列表时,我将在“onItemClick()”中创建该捆绑包。然后在我的详细信息片段(有 3 个选项卡(它们是子片段?))上,我将把包放在“OnCreateView()”中,这会将数据传递给我所有的 3 个选项卡,对吗?
  • 说 3 个标签片段是指 3 个片段和一个 TabActivity?
  • 我已经编辑了答案,也许会更清楚。
  • 我的意思是在动作栏中的标签之间切换,每个标签对应一个片段
  • 请出示您的最后一个代码(带有片段的那个)
【解决方案2】:

由于EmpresaDetailsActivity 是包含您的三个FragmentsActivity,我认为将数据从MainActivity 传递到EmpresaDetailsActivity,然后从那里传递到Fragments 是一个很好的做法。这样你就尊重等级制度。

要将值从Activity 传递给Fragment,您可以执行以下操作:

1) 在每个Fragment 类中定义一个名为newInstance 的静态方法,您将在其中获取所有值

public static YourFragmentClass newInstance(int myValue, int MyValue2) {
    // You can add as many values as you need to initialize your fragment
    YourFragmentClass fragment = new YourFragmentClass();
    Bundle args = new Bundle();
    args.putInt("value_key", myValue);
    args.putInt("value_key2", myValue2);
    fragment.setArguments(args);
    return fragment;
}

2) 在您的 TabAdapter 中,当您创建 Fragments 时,只需将您的 Fragment 声明替换为

YourFragmentClass.newInstance(value1, value2);

3) 在每个FragmentonCreate 方法上检索您传递的值:

@Override
public View onCreate(Bundle savedInstanceState) {

    int myValue = getArguments().getInt("value_key"));
    int myValue2 = getArguments().getInt("value_key2"));
}

这样你就有了一种更简洁的方式来初始化你的Fragments

【讨论】:

  • 谢谢,我会尽快试试的!
  • 那么,在我的 3 个片段中,我实现了第 1 步和第 3 步?实现这 3 个片段的类和我的主类呢?
  • 保持你的主类不变,实现 3 个片段的那个应该是你执行第 2 步的地方,特别是在 getItem 方法下的 TabsPagerAdapeter 中
  • 所以我留下了我的 AllEmpresaActivity 和 EmpresaDetailsActivity。如何从 TabsPagerAdapter 中的 AllEmpresaActivity 获取值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 2018-01-07
相关资源
最近更新 更多