Java 使用多个onclicklistener添加到SharedReference值

Java 使用多个onclicklistener添加到SharedReference值,java,android,onclick,Java,Android,Onclick,我在代码中实现了多个点击监听器。但是,我希望从单独的图像中单击的每一次都保存在共享首选项中的“ticker”中。所以,如果在图像1上有2次点击,在图像2上有4次点击,在图像3上有6次点击,那么在共享优先中总共有12次“点击”。问题是,每个onClick侦听器似乎都覆盖了另一个,而不是堆叠。关于如何实现这一点有什么想法吗 Image1.setOnClickListener(new View.OnClickListener() { SharedPreferences pref = getShare

我在代码中实现了多个点击监听器。但是,我希望从单独的图像中单击的每一次都保存在共享首选项中的“ticker”中。所以,如果在图像1上有2次点击,在图像2上有4次点击,在图像3上有6次点击,那么在共享优先中总共有12次“点击”。问题是,每个onClick侦听器似乎都覆盖了另一个,而不是堆叠。关于如何实现这一点有什么想法吗

Image1.setOnClickListener(new View.OnClickListener() { 
SharedPreferences pref = getSharedPreferences("ActivityPREF", Context.MODE_PRIVATE);
int numClicks = pref.getInt("Total_Clicks", 0);

@Override
public void onClick (View v) { 
            numClicks++;
        }

        SharedPreferences pref = 
                            getSharedPreferences("ActivityPREF", Context.MODE_PRIVATE);
        Editor ed = pref.edit();
        ed.putInt("Total_Clicks", numClicks);
        ed.apply();
} 
}); 

Image2.setOnClickListener(new View.OnClickListener() { 
SharedPreferences pref = getSharedPreferences("ActivityPREF", Context.MODE_PRIVATE);
int numClicks = pref.getInt("Total_Clicks", 0);

@Override
public void onClick (View w) { 
            numClicks++;
        }

        SharedPreferences pref = 
                            getSharedPreferences("ActivityPREF", Context.MODE_PRIVATE);
        Editor ed = pref.edit();
        ed.putInt("Total_Clicks", numClicks);
        ed.apply();
} 
}); 

Image3.setOnClickListener(new View.OnClickListener() { 
SharedPreferences pref = getSharedPreferences("ActivityPREF", Context.MODE_PRIVATE);
int numClicks = pref.getInt("Total_Clicks", 0);

@Override
public void onClick (View x) { 
            numClicks++;
        }

        SharedPreferences pref = 
                            getSharedPreferences("ActivityPREF", Context.MODE_PRIVATE);
        Editor ed = pref.edit();
        ed.putInt("Total_Clicks", numClicks);
        ed.apply();
} 
}); 

您将跟踪numclicks 3次(在每个OnClickListener中),因此它们可以相互覆盖

对于初学者,您可以只创建一次OnClickListener,并将其分配给每个图像。这应该解决这个问题:

View.OnClickListener imageClickedListener = new View.OnClickListener() {
        SharedPreferences pref = getSharedPreferences("ActivityPREF", Context.MODE_PRIVATE);
        int numClicks = pref.getInt("Total_Clicks", 0);

        @Override
        public void onClick (View v) {
            numClicks++;

            Editor ed = pref.edit();
            ed.putInt("Total_Clicks", numClicks);
            ed.apply();
        }


}

Image1.setOnClickListener(imageClickedListener);
Image2.setOnClickListener(imageClickedListener);
Image3.setOnClickListener(imageClickedListener);
编辑:

我在这里为你的评论添加了一个回复,因为我觉得它更清晰

SharedReferences实例不是问题所在。它们都与相同的保存数据(“ActivityPREF”)通信。问题是,您有3个OnClickListener实例,而这3个实例都包含整数numClicks。因此,它们都从0(或以前保存的数量)开始,只增加了本地numclick。因此,如果我轻触image1两次,侦听器中的numclick将在2上。而其他的仍然是0

如果您在增加numclick之前向onClick方法添加了以下内容,那么它就会起作用:

numClicks = pref.getInt("Total_Clicks", 0);

因为它将从保存的值重新加载它。每次单击时只调用onClick方法中的代码,而不是实例化onClick侦听器时添加的代码。

您的答案解决了我的问题。但是,我确实有一个问题,因为我还在学习。为什么以前写的方式不起作用?因为SharedReferences的每个实例都是在一个单独的操作中调用的,所以它本质上不是相同的,而是更长的吗?为了更清楚,我在答案中添加了一个回复。我现在要上床睡觉了,我意识到我不是最擅长解释的人,但是如果你有更多关于这个话题的问题,请随意提问,我会在早上尝试回答。所以,如果我把“int numClicks=pref.getInt(“Total_Clicks”,0);”从.setOnClickListener移到OnClick(){},它也会以同样的方式工作吗?是的,那,保存到首选项的代码,所以基本上是点击监听器中的所有代码。你知道,我之前试过,当它是这样的时候,没有一个点击被保存