Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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
Android 将数据从活动传递到片段_Android_Android Fragments - Fatal编程技术网

Android 将数据从活动传递到片段

Android 将数据从活动传递到片段,android,android-fragments,Android,Android Fragments,我已经完成了一个简单的应用程序,可以通过json列出mysql数据库中的所有产品。当我单击某个特定产品时,它会将我带到一个显示其详细信息的活动。 现在我改变了我的应用程序,当我从列表中点击一个特定的产品时,它会变成一个3个标签的片段。我已经创建了所有相关的片段,一切都很好。只有当我尝试将数据从list all products活动传递到details fragment活动时,它才起作用。如何将列出所有产品的主屏幕中的数据传递到显示详细信息的3个片段 进一步解释: 没有框架的工作示例: 主活动显示

我已经完成了一个简单的应用程序,可以通过json列出mysql数据库中的所有产品。当我单击某个特定产品时,它会将我带到一个显示其详细信息的活动。 现在我改变了我的应用程序,当我从列表中点击一个特定的产品时,它会变成一个3个标签的片段。我已经创建了所有相关的片段,一切都很好。只有当我尝试将数据从list all products活动传递到details fragment活动时,它才起作用。如何将列出所有产品的主屏幕中的数据传递到显示详细信息的3个片段

进一步解释:

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

现在我有了显示所有产品的主要活动。我是将数据传递给->“公共类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();
    }
具有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) {
    }

}
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;
    }
}
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 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) {
    }

}
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;
    }
}

在活动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和setArguments。(如上所示)
  • 活动-->活动:使用Intent和putExtra
  • 片段-->活动:使用接口。Avtivity应该实现它,片段应该调用它

检查新代码后:

  • 将字符串包装在一个包中,并将其从MainActivity传递到EmpresaDetailsActivity
  • 使用getIntent().getExtras()在那里获取它
  • 将您的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;
    }   
    }
    
  • 实例化适配器时,将包传递给其构造函数
  • 在片段类中,使用getArguments()获取捆绑包,就完成了

  • 由于
    EmpresaDetailsActivity
    是包含三个
    片段的
    活动
    ,因此我认为将数据从
    main活动
    传递到
    EmpresaDetailsActivity
    ,然后再从那里传递到
    片段
    。这样,您就尊重了层次结构

    要将值从
    活动
    传递到
    片段
    ,可以执行以下操作:

    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) 在选项卡适配器中,当您创建
    片段
    时,只需将
    片段
    声明替换为

    YourFragmentClass.newInstance(value1, value2);
    
    3) 在每个
    Fragment
    onCreate
    方法上,检索您传递的值:

    @Override
    public View onCreate(Bundle savedInstanceState) {
    
        int myValue = getArguments().getInt("value_key"));
        int myValue2 = getArguments().getInt("value_key2"));
    }
    

    这样你就有了一个更清晰的方法来初始化你的
    片段

    可能的重复,只是为了澄清(因为我刚刚开始使用片段来更新自己),当我有我活动中所有产品的列表时,我将在“onItemClick()”中创建该捆绑包(它们是子片段?)我将把包放在“OnCreateView()”中,这将把数据传递给我的所有3个选项卡,对吗?说3个选项卡片段,你是指3个片段和一个选项卡活动?我编辑了答案,也许会更清楚。我的意思是在操作栏中的选项卡之间切换,每个选项卡对应一个片段。请显示你的最后代码(带碎片的那个)谢谢,我会尽快尝试!因此,在我的3个片段中,我实现了步骤1和步骤3?那么实现3个片段的类和我的主类呢?让主类保持原样,实现3个片段的类应该在执行步骤2的地方,特别是在
    getItem
    方法下的TabsPagerAdapter中,所以我没有讨论我的问题AllEmpresaActivity和EmpresaDetailsActivity。如何从TabsPagerAdapter中的AllEmpresaActivity获取值?