如何从片段到详细信息视图的意图



我有两个片段:第一个片段,片段 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。其中,包含数据的类可以发布数据,片段可以订阅数据。考虑发布主题。

希望这对:)有用

最新更新