gpt4 book ai didi

android - 将数据从 Activity 传递到 Fragments

转载 作者:太空狗 更新时间:2023-10-29 16:16:16 25 4
gpt4 key购买 nike

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

进一步说明:

没有框架的工作示例:Main Activity显示所有产品并在选择单个产品后将其传递给Details Activity-> Details Activity从Main Activity获取数据并显示Details

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

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

@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 个 fragment 的新详细信息类:

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 个 fragment 中的 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;
}
}

最佳答案

在您的 onItemClick() Activity 中,在启动 fragment 之前:

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

在您的 fragment OnCreateView() 上:

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

更清楚地说,这里是您应该如何在 Activity/Fragment 之间传递数据。

  • Activity --> Fragment:使用 Bundle 和 setArguments。 (如上图)
  • Activity --> Activity :使用 Intent 和 putExtra。
  • fragment --> Activity :使用界面。 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. 在您的 fragment 类中使用 getArguments() 来获取包,您就完成了。

关于android - 将数据从 Activity 传递到 Fragments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26244459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com