【问题标题】:Using same fragments but different content in Android在 Android 中使用相同的片段但不同的内容
【发布时间】:2016-04-19 09:09:06
【问题描述】:

情况就是这样。 我正在尝试开发一个 Android 应用程序,该应用程序将使用 CardView 显示餐厅列表。每次用户点击餐厅时,它会显示一个包含 3 个带有滑动视图的片段的屏幕 - DetailsFragment、MenuFragment 和 TableBookingFragment。

我是 Android 开发新手,所以我不知道该怎么办。

最初我想为用户点击的不同餐厅启动意图。但在那种情况下,我将不得不为不同的餐厅创建如此多的活动。假设我的列表中有 10 家餐厅,我将不得不构建 10 个活动来描述不同的细节和菜单(但使用相同的布局)。

有没有更好的方法来显示不同餐厅的详细信息和菜单(无需创建这么多活动)?

如果我的问题描述得不够清楚,请告诉我。

提前致谢。

餐厅.java

public class Restaurant extends AppCompatActivity {

private TabLayout tabLayout;
private ViewPager viewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_restaurant);

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
}

private void setupViewPager(ViewPager viewPager){
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new details(), "Details");
    adapter.addFragment(new menu(), "Menu");
    adapter.addFragment(new tableBooking(), "Table booking");
    viewPager.setAdapter(adapter);
}

class ViewPagerAdapter extends FragmentPagerAdapter{

    private final List<Fragment> fragmentList = new ArrayList<>();
    private final List<String> fragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager){
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getCount() {
        return fragmentList.size();
    }

    public void addFragment (Fragment fragment, String title){
        fragmentList.add(fragment);
        fragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return fragmentTitleList.get(position);
    }
}

}

RestaurantListAdapter.java

 public class RestaurantListAdapter extends RecyclerView.Adapter<RestaurantListAdapter.ViewHolder>  {
    List<RestaurantList_Item> items;
    private static ClickListener clickListener;
    private Context context;

    public RestaurantListAdapter(){
        super();
        items = new ArrayList<RestaurantList_Item>();

        // POSITION 1
        RestaurantList_Item restaurant = new RestaurantList_Item();
        restaurant.setrImage(R.mipmap.img_anjappar);
        restaurant.setrName("Anjappar Indian Chettinad Restaurant");
        restaurant.setrCuisine("Indian");
        items.add(restaurant);

        // POSITION 2
        restaurant = new RestaurantList_Item();
        restaurant.setrImage(R.mipmap.img_morganfield);
        restaurant.setrName("Morganfield");
        restaurant.setrCuisine("Western");
        items.add(restaurant);

        // POSITION 3
        restaurant = new RestaurantList_Item();
        restaurant.setrImage(R.mipmap.img_nandos);
        restaurant.setrName("Nando's");
        restaurant.setrCuisine("Western");
        items.add(restaurant);

        // POSITION 4
        restaurant = new RestaurantList_Item();
        restaurant.setrImage(R.mipmap.img_shellout);
        restaurant.setrName("Shellout");
        restaurant.setrCuisine("Seafood");
        items.add(restaurant);

        // POSITION 5
        restaurant = new RestaurantList_Item();
        restaurant.setrImage(R.mipmap.img_beyond);
        restaurant.setrName("Beyond Veggie");
        restaurant.setrCuisine("Vegetarian");
        items.add(restaurant);

        // POSITION 6
        restaurant = new RestaurantList_Item();
        restaurant.setrImage(R.mipmap.img_myelephant);
        restaurant.setrName("My Elephant");
        restaurant.setrCuisine("Thai");
        items.add(restaurant);

        // POSITION 7
        restaurant = new RestaurantList_Item();
        restaurant.setrImage(R.mipmap.img_padangkota);
        restaurant.setrName("Nasi Kandar Padang Kota");
        restaurant.setrCuisine("Mamak");
        items.add(restaurant);

    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {

        View v = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.cardview_restaurant, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
        RestaurantList_Item restaurant = items.get(position);
        viewHolder.resImage.setImageResource(restaurant.getrImage());
        viewHolder.restaurantName.setText(restaurant.getrName());
        viewHolder.cuisine.setText(restaurant.getrCuisine());
        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Context context = v.getContext();
//                Toast.makeText(context, "Item clicked with position " +position, Toast.LENGTH_LONG).show();
            }
        });
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        public ImageView resImage;
        public TextView restaurantName;
        public TextView cuisine;

        public ViewHolder(final View itemView) {
            super(itemView);
            resImage = (ImageView) itemView.findViewById(R.id.resImage);
            restaurantName = (TextView) itemView.findViewById(R.id.restaurantName);
            cuisine = (TextView) itemView.findViewById(R.id.cuisine);
            itemView.setOnClickListener(this);
        }


        @Override
        public void onClick(View v) {
            clickListener.onItemClick(getAdapterPosition(), v);
        }

    }

    public void setOnItemClickListener (ClickListener clickListener){
        RestaurantListAdapter.clickListener = clickListener;
    }

    public interface ClickListener{
        void onItemClick (int position, View v);
    }
}

details.java -(Restaurant.java 中的第一个片段)

public class details extends Fragment {

    public details() {
        // Required empty public constructor
    }


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_details, container, false);
    }

}

menu.java(第二个片段)

public class menu extends Fragment {


    public menu() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_menu, container, false);
    }

}

fragment_details.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.jenna.iwanteat.fragments.details">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:id="@+id/resName"
        android:text="Restaurant Name"
        android:textSize="16sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_marginLeft="20dp"
    />

    <TextView
        android:id="@+id/resAddress"
        android:text="Restaurant Address"
        android:textSize="12sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="45dp"
        android:layout_marginLeft="20dp"
        />

    <TextView
        android:id="@+id/resPhone"
        android:text="Restaurant Phone"
        android:textSize="12sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="65dp"
        android:layout_marginLeft="20dp"
        />

    <TextView
        android:id="@+id/resCuisine"
        android:text="Types of Cuisine"
        android:textSize="12sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="85dp"
        android:layout_marginLeft="20dp"
        />

    <TextView
        android:id="@+id/resPriceRange"
        android:text="Price Range"
        android:textSize="12sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="105dp"
        android:layout_marginLeft="20dp"
        android:textStyle="italic"
        />



</FrameLayout>

RestaurantModel.java

public class RestaurantModel {

    // variable main photo
    private int mainImage;

    //variables for details fragment
    private String resName, resAddress, resPhone, resCuisine, resPriceRange;

    //variables for menu fragment
    private int foodPhoto;
    private String foodPrice, foodDescription;

    //get set methods
    public int getMainImage(){
        return mainImage;
    }

    public void setMainImage(int mainImage){
        this.mainImage = mainImage;
    }

    public String getResName(){
        return resName;
    }

    public void setResName(String resName){
        this.resName = resName;
    }

    public String getResAddress(){return resAddress;}

    public void setResAddress(String resAddress){this.resAddress = resAddress;}

    public String getResPhone(){return resPhone;}

    public void setResPhone(String resPhone){this.resPhone = resPhone;}

    public String getResCuisine(){return resCuisine;}

    public void setResCuisine(String resCuisine){this.resCuisine = resCuisine;}

    public String getResPriceRange(){return resPriceRange;}

    public void setResPriceRange(String resPriceRange){this.resPriceRange = resPriceRange;}

    public int getFoodPhoto(){return foodPhoto;}

    public void setFoodPhoto(int foodPhoto){this.foodPhoto = foodPhoto;}

    public String getFoodDescription(){return foodDescription;}

    public void setFoodDescription(String foodDescription){this.foodDescription = foodDescription;}

    public String getFoodPrice(){return foodPrice;}

    public void setFoodPrice(String foodPrice){this.foodPrice = foodPrice;}
}

【问题讨论】:

    标签: android android-activity fragment


    【解决方案1】:

    在 Intent 中,你有额外的东西。在额外内容中,您可以放入整数、双精度、长整数、字符串、实现 Serializable 或 Parcelable 的任何对象,或任何这些事物的列表。因此,您要么通过 extras 传递所有数据,要么通过 extras 传递某种获取数据的方式(如文件名或 url)。

    【讨论】:

      【解决方案2】:

      您想以相同的布局显示不同的数据 为什么你不添加只发送这些碎片网的数据

         Intent intent = new Intent(your activity,your new activity which    
         contain container for your fragment)
         intent.putExtra("key","String you want to send");
      

      接收意图

              String id = intent.getStringExtra("key");
      

      如果您在片段中使用卡片视图,则将数据打包并通过片段发送 发送数据

      Bundle bundle = new Bundle();
      bundle.putString("edttext", "From Activity");
      // set Fragmentclass Arguments
      Fragmentclass fragobj = new Fragmentclass();
      fragobj.setArguments(bundle); 
      

      分片接收

         String strtext = getArguments().getString("edttext");    
      

      【讨论】:

      • 嗨。谢谢回答。如果我想使用 POJO 类中的 setmethod 将数据从活动发送到片段怎么办?
      • 你可以让 pojo 类实现可序列化并通过 bundle 发送对象 Bundle bundle = new Bundle(); bundle.putSerializable("key","你要发送的对象")
      【解决方案3】:

      您只需要餐厅的一项 Activity(除了您的餐厅列表 Activity)。当您从列表中单击餐厅时打开第二个活动时,您需要传递相应的数据来识别第二个活动中的餐厅。在您的第二个活动中根据传入的数据显示数据。

      要向 Activity 发送数据,您需要使用 Intents。在这里查看http://developer.android.com/training/basics/firstapp/starting-activity.html 了解它是如何完成的。

      您可以在此处找到需要根据需要修改的代码

      开始活动时

      Intent intent = new Intent(this, DisplayMessageActivity.class);
      EditText editText = (EditText) findViewById(R.id.edit_message);
      String message = editText.getText().toString();
      intent.putExtra(EXTRA_MESSAGE, message);
      

      第二个活动

      Intent intent = getIntent();
      String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE);
      

      如果您需要更多帮助,请添加一些您现在正在使用的代码。

      【讨论】:

      • 使 RestaurantList_Item 实现一个 parcelable (developer.android.com/reference/android/os/Parcelable.html)。在上面的代码中将其更改为 intent.putExtra(EXTRA_MESSAGE, );并在您的 Restaurant.java onCreate 添加 RestaurantList_Item item = intent.getParcelableExtra(MyActivity.EXTRA_MESSAGE);
      • Restaurant_ListItem 是使用 CardView 和 RecyclerView 显示餐厅列表,那我是不是应该在 RestaurantModel.java 中实现 parcelable(其中包含 get set 方法)?
      • 你想在第二个活动中显示什么数据?你从哪里得到它?
      • 你可能想检查另一个链接 [stackoverflow.com/questions/36758864/…我已经更详细地描述了我的 qs
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 2023-03-24
      • 2020-10-22
      • 1970-01-01
      相关资源
      最近更新 更多