我有两个片段:第一个片段,片段 1,包括一个包含两个案例的列表视图,每个案例都有一个详细信息视图。第二个片段(片段 2(有两个需要连接到片段 1 的图像。单击图像 1 时,我想从片段 2 开始意图并在片段中显示案例 1 的详细信息。片段代码附在下面。
有没有办法从片段到细节视图的意图?谢谢。
片段 1
public class fragment1 extends Fragment {
public fragment1() {
// Required empty public constructor
}
//meal list
int[] IMAGES={R.drawable.AA,R.drawable.BB};
String[] NAMES={"Case 1","Case 2"};
String[] DESCRIPTION={ "Plastic","Wood" };
int[] IMAGES2={};
String[] NAMES2={};
String[] DESCRIPTION2={};
Toolbar toolbar;
ListView listView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_1, container, false);
getActivity().setTitle("Cases");
toolbar=(Toolbar) rootView.findViewById(R.id.toolbar);
toolbar.setTitle("Cases");
listView=(ListView) rootView.findViewById(R.id.listView_caselist);
CustomAdapter customAdapter=new CustomAdapter();
listView.setAdapter(customAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TextView textView_name=(TextView) view.findViewById(R.id.textView_title);
String casename=textView_name.getText().toString();
Toast.makeText(getActivity().getApplicationContext(),"Select case:"+casename,Toast.LENGTH_SHORT).show();
switch(casename){
//********add items for each case********
case "Case1":
IMAGES2= new int[] {R.drawable.item_1, R.drawable.item_2};
NAMES2=new String[]{"item_1","item_2”};
DESCRIPTION2=new String{“50”,”20”};
OpenDetailandPassValues("Case2",IMAGES2,NAMES2);
break;
case "Case2":
IMAGES2= new int[] {R.drawable.item_2, R.drawable.item_3};
NAMES2=new String[]{"item_2","item_3”};
DESCRIPTION2=new String{“50”,”20”};
OpenDetailandPassValues("Case2",IMAGES2,NAMES2);
break;
}
}
});
// Inflate the layout for this fragment
return rootView;
}
// pass values to activity
private void OpenDetailandPassValues(String name,int[] IMAGE2,String[] NAMES2,String[] DESCRIPTION2){
Intent intent = new Intent(getActivity(),MealDetail.class);
intent.putExtra("NAME_KEY",name);
intent.putExtra("IMAGE",IMAGE2);
intent.putExtra("NAME",NAMES2);
intent.putExtra("DESP",DESCRIPTION2);
startActivity(intent);
}
//create list
class CustomAdapter extends BaseAdapter {
@Override
public int getCount() {
return IMAGES.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView= getActivity().getLayoutInflater().inflate(R.layout.customlayout,null);
ImageView imageView=(ImageView) convertView.findViewById(R.id.imageView1);
TextView textView_name=(TextView) convertView.findViewById(R.id.textView_title);
TextView textView_desp=(TextView) convertView.findViewById(R.id.textView_description);
imageView.setImageResource(IMAGES[position]);
textView_name.setText(NAMES[position]);
textView_desp.setText(DESCRIPTION[position]);
return convertView;
}
}
}
片段 2
public class MainPage extends Fragment implements View.OnClickListener {
public MainPage() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
getActivity().setTitle("Main Page");
View v = inflater.inflate(R.layout.fragment_main_page, container, false);
Typeface myTypeface = Typeface.createFromAsset(getActivity().getAssets(),"snap_itc.ttf");
ImageView ivfearless = (ImageView) v.findViewById(R.id.image1);
ivfearless.setOnClickListener(this);
ImageView ivcaptain = (ImageView) v.findViewById(R.id.image2);
ivcaptain.setOnClickListener(this);
return v;
}
@Override
public void onClick(View v) {
// implements your things
switch (v.getId()) {
case R.id.image1:
fragment1 Fragment2=new fragment1 ();
FragmentManager manager2=getActivity().getSupportFragmentManager();
manager2.beginTransaction().replace(R.id.relative_layout_for_fragment,Fragment2,Fragment2.getTag()).commit();
break;
case R.id.image2:
fragment1 Fragment3=new fragment1 ();
FragmentManager manager3=getActivity().getSupportFragmentManager();
manager3.beginTransaction().replace(R.id.relative_layout_for_fragment, Fragment3,Fragment3.getTag()).commit();
break;
}
}
}
好吧,您可以在显示片段的同时传递捆绑对象。喜欢
Bundle bundle = new Bundle();
bundle.putString("showCase" , "Case1");
Fragment1 fragment = new Fragment1();
fragment.setArguments(bundle);
然后在您的 Fragment1 中,使用
Bundle bundle = getArguements();
String showCase = bundle.getString("showCase");
// DO as you like
我建议使用发布订阅方法的概念来消除依赖项的紧密耦合。您可以签出事件总线,这是一个 Android 优化的事件总线,可简化活动、片段、线程、服务等之间的通信。更少的代码,更好的质量。
另一种选择是使用捆绑包并在创建时将它们传递给片段。甚至考虑键/值对存储和检索的共享首选项。
另一个有趣的想法是使用来自rxjava和rxandroid的obsevable。其中,包含数据的类可以发布数据,片段可以订阅数据。考虑发布主题。
希望这对:)有用