【问题标题】:How to Intent from fragment to detail view?如何从片段到详细视图?
【发布时间】:2017-10-08 13:09:47
【问题描述】:

我有两个片段:第一个片段 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;

    }
}
}

【问题讨论】:

  • 我强烈建议您学习 Parcelable 对象,而不是传递一堆单独的附加对象

标签: android listview android-fragments detailview


【解决方案1】:

你可以在显示 Fragment 时传入 Bundle 对象。喜欢

Bundle bundle = new Bundle();
bundle.putString("showCase" , "Case1");
Fragment1 fragment = new Fragment1();
fragment.setArguments(bundle);

然后在您的 Fragment1 中,使用

获取“showCase”的值
Bundle bundle = getArguements();
String showCase = bundle.getString("showCase");
// DO as you like

【讨论】:

    【解决方案2】:

    我建议使用发布订阅方法的概念,以消除依赖关系的紧密耦合。您可以签出事件总线,这是一个 Android 优化的事件总线,可简化活动、片段、线程、服务等之间的通信。更少的代码,更好的质量。

    另一种选择是使用捆绑包并在创建时将它们传递给片段。甚至考虑键/值对存储和检索的共享首选项。

    另一个有趣的想法是使用来自 rxjava 和 rxandroid 的 obsevables。其中包含数据的类可以发布数据,片段可以订阅数据。请考虑 PublishSubject。

    希望这很有用:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      相关资源
      最近更新 更多