【问题标题】:button.setText() does not work inside onClick() methodbutton.setText() 在 onClick() 方法中不起作用
【发布时间】:2019-06-14 09:00:20
【问题描述】:

我有一个视图寻呼机,其中每个页面都有一个带有图像、一些文本和一个按钮的卡片视图。单击后,我需要更改每个页面的按钮文本。 所以在 ViewPagerAdapter mapSize.setText() 里面只能在 setOnClickListener() 外面工作,而在 onClick 里面它不起作用。 这是我的 ViewPagerAdapter 类

public class ViewPagerAdapter extends PagerAdapter {

    private List<Model> models;
    private LayoutInflater layoutInflater;
    private Context context;
    private Button mapSize;
    private Integer size;
    private static final String TAG = "ViewPagerAdapter";

    public ViewPagerAdapter(Context context, List<Model> models, String playerName) {
        this.models = models;
        this.layoutInflater = layoutInflater;
        this.context = context;
    }

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

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
        return view.equals(o);
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, final int position) {
        layoutInflater = LayoutInflater.from(context);
        View view = null;

        ImageView imageView;
        TextView title, desc;
        imageView = view.findViewById(R.id.gameModeImage);
        title = view.findViewById(R.id.title);
        desc = view.findViewById(R.id.description);
        imageView.setImageResource(models.get(position).getImage());
        title.setText(models.get(position).getTitle());
        desc.setText(models.get(position).getDescription());
        mapSize = view.findViewById(R.id.mapSizeBtn);

        mapSize.setText("hello2"); //here works

        mapSize.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mapSize.setText("hello"); //here does not work
            }
        });
        container.addView(view, 0);

        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "This page was clicked: " + position);
                    if (position != 1)
                        Toast.makeText(context, "Coming Soon.", Toast.LENGTH_SHORT).show();
                    else {
                        Intent newGameActivity = new Intent(context, com.game.project.GameActivity.class);
                        newGameActivity.putExtra("size", size);
                        context.startActivity(newGameActivity);
                    }
                }
        });


        return view;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView((View)object);
    }



}

【问题讨论】:

    标签: android button onclick android-viewpager settext


    【解决方案1】:

    您为每个项目重新分配您的按钮,一个新项目在您的适配器中实例化。 您必须以这种方式引用您的按钮:

    @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, final int position) {
            layoutInflater = LayoutInflater.from(context);
            View view = null;
    
            ImageView imageView;
            TextView title, desc;
            imageView = view.findViewById(R.id.gameModeImage);
            title = view.findViewById(R.id.title);
            desc = view.findViewById(R.id.description);
            imageView.setImageResource(models.get(position).getImage());
            title.setText(models.get(position).getTitle());
            desc.setText(models.get(position).getDescription());
            final Button mapSize = view.findViewById(R.id.mapSizeBtn);
    
            mapSize.setText("hello2"); //here works
    
            mapSize.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mapSize.setText("hello"); //here does not work
                }
            });
            container.addView(view, 0);
    
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d(TAG, "This page was clicked: " + position);
                        if (position != 1)
                            Toast.makeText(context, "Coming Soon.", Toast.LENGTH_SHORT).show();
                        else {
                            Intent newGameActivity = new Intent(context, com.game.project.GameActivity.class);
                            newGameActivity.putExtra("size", size);
                            context.startActivity(newGameActivity);
                        }
                    }
            });
    
    
            return view;
        }
    

    【讨论】:

      【解决方案2】:

      instantiate item 中的所有项目都应声明为 final 才能正常工作。

      【讨论】:

        猜你喜欢
        • 2013-08-05
        • 1970-01-01
        • 1970-01-01
        • 2011-11-17
        • 1970-01-01
        • 2019-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多