【问题标题】:Card Layout Action Button卡片布局操作按钮
【发布时间】:2017-08-17 22:27:24
【问题描述】:

我创建了一个包含四张卡片的卡片布局。

我的卡片样本可以在图片中找到。 动态创建它们的代码如下:

public class four_future extends Fragment {
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters


    public four_future() {
        // Required empty public constructor
    }
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        RecyclerView recyclerView = (RecyclerView) inflater.inflate(
                R.layout.recycler_view, container, false);
        ContentAdapter adapter = new ContentAdapter(recyclerView.getContext());
        recyclerView.setAdapter(adapter);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        return recyclerView;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public ImageView picture;
        public TextView name;
        public TextView description;
        public ViewHolder(LayoutInflater inflater, ViewGroup parent) {
            super(inflater.inflate(R.layout.four_future, parent, false));
            picture = (ImageView) itemView.findViewById(R.id.card_image);
            name = (TextView) itemView.findViewById(R.id.card_title);
            description = (TextView) itemView.findViewById(R.id.card_text);
            // Adding Snackbar to Action Button inside card
            Button button = (Button)itemView.findViewById(R.id.action_button);
            button.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    Snackbar.make(v, "Action is pressed",
                            Snackbar.LENGTH_LONG).show();
                }
            });


        }
    }
    /**
     * Adapter to display recycler view.
     */
    public static class ContentAdapter extends RecyclerView.Adapter<ViewHolder> {
        // Set numbers of List in RecyclerView.
        private static final int LENGTH = 3
                ;

        private final String[] mPrograms;

        private final Drawable[] mProgramPictures;

        public ContentAdapter(Context context) {
            Resources resources = context.getResources();
            mPrograms = resources.getStringArray(R.array.programs);

            TypedArray a = resources.obtainTypedArray(R.array.program_picture);
            mProgramPictures = new Drawable[a.length()];
            for (int i = 0; i < mProgramPictures.length; i++) {
                mProgramPictures[i] = a.getDrawable(i);
            }
            a.recycle();
        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new ViewHolder(LayoutInflater.from(parent.getContext()), parent);
        }

        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            holder.picture.setImageDrawable(mProgramPictures[position % mProgramPictures.length]);
            holder.name.setText(mPrograms[position % mPrograms.length]);

        }

        @Override
        public int getItemCount() {
            return LENGTH;
        }
    }
}

我在每张卡片上都有操作按钮。如何在点击不同卡片上的操作按钮时打开不同的活动。截至目前,每个操作按钮都只是提供一个小吃店。如果我单击第一张卡片上的操作按钮,它必须打开 first_activity.xml。我怎样才能做到这一点?

【问题讨论】:

    标签: android android-layout android-fragments material-design cardlayout


    【解决方案1】:

    在您的onBindViewHolder 实现中,将有关要打开哪个Activity 的信息存储在Button 中(您可以做一些简单的事情,例如使用正确的Activity 标签设置按钮标签,或存储一个Intent)。然后在你做的 ViewHolder 中

    Button button = (Button)itemView.findViewById(R.id.action_button);
    

    您可以检索标签并使用它来打开正确的活动。

    编辑:试试这个:

    更改您的 ViewHolder:

        public static class ViewHolder extends RecyclerView.ViewHolder {
            public ImageView picture;
            public TextView name;
            public TextView description;
            public Button button;
            public ViewHolder(LayoutInflater inflater, ViewGroup parent) {
                super(inflater.inflate(R.layout.four_future, parent, false));
                picture = (ImageView) itemView.findViewById(R.id.card_image);
                name = (TextView) itemView.findViewById(R.id.card_title);
                description = (TextView) itemView.findViewById(R.id.card_text);
                // Adding Snackbar to Action Button inside card
                button = (Button)itemView.findViewById(R.id.action_button);
                button.setOnClickListener(new View.OnClickListener(){
                    @Override
                    public void onClick(View v) {
                        if("activity1".equals(button.getTag()){
                            startActivity1();
                        }else if("activity2".equals(button.getTag()){
                            startActivity2();
                        }else{
                        Snackbar.make(v, "Action is pressed",
                                Snackbar.LENGTH_LONG).show();
                        }
                    }
                });
            }
        }
    

    然后修改onBindViewHolder调用设置标签:

    @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            holder.picture.setImageDrawable(mProgramPictures[position % mProgramPictures.length]);
            holder.name.setText(mPrograms[position % mPrograms.length]);
            if(position == 0) holder.button.setTag("activity1");
            else if(position == 1) holder.button.setTag("activity2");
        }
    

    【讨论】:

    • Femi,你能指导一下在 Button 中存储有关 Activity 信息的编码步骤吗?
    • 费米,非常感谢。还有一个好处,我还创建了 6 到 7 个图块的图块布局。可以指点我的教程,该教程解释了如何为每个图块添加可点击功能?
    猜你喜欢
    • 2016-10-24
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    相关资源
    最近更新 更多