Android 将数据从活动传递到片段
我已经完成了一个简单的应用程序,可以通过json列出mysql数据库中的所有产品。当我单击某个特定产品时,它会将我带到一个显示其详细信息的活动。 现在我改变了我的应用程序,当我从列表中点击一个特定的产品时,它会变成一个3个标签的片段。我已经创建了所有相关的片段,一切都很好。只有当我尝试将数据从list all products活动传递到details fragment活动时,它才起作用。如何将列出所有产品的主屏幕中的数据传递到显示详细信息的3个片段 进一步解释: 没有框架的工作示例: 主活动显示所有产品,并在选择单个产品时将其传递给详细信息活动->详细信息活动从主活动获取数据并显示详细信息 现在我有了显示所有产品的主要活动。我是将数据传递给->“公共类EmpresaDetailsActivity extends FragmentActivity implements ActionBar.TabListener{etc”,还是必须将其传递给我创建的所有其他3个单独片段 (旧方法)列出所有产品:Android 将数据从活动传递到片段,android,android-fragments,Android,Android Fragments,我已经完成了一个简单的应用程序,可以通过json列出mysql数据库中的所有产品。当我单击某个特定产品时,它会将我带到一个显示其详细信息的活动。 现在我改变了我的应用程序,当我从列表中点击一个特定的产品时,它会变成一个3个标签的片段。我已经创建了所有相关的片段,一切都很好。只有当我尝试将数据从list all products活动传递到details fragment活动时,它才起作用。如何将列出所有产品的主屏幕中的数据传递到显示详细信息的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应该实现它,片段应该调用它
检查新代码后:
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;
}
}
由于
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获取值?