使用多个onclicklistener添加到SharedPreference值

时间:2013-10-22 23:36:46

标签: java android onclick

我在代码中实现了多个点击侦听器。但是,我希望从单独的图像中的每次单击都保存在共享首选项中的“自动收报机”中。因此,如果图像1上有2次点击,图像2上有4次点击,图像3上有6次点击,则共享首选项中计算的最多为12次“点击”。问题是,每个onClickListener似乎都覆盖了另一个,而不是堆叠。关于如何实现这一目标的任何想法?

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();
} 
}); 

1 个答案:

答案 0 :(得分:1)

您正在跟踪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);

修改

我在这里添加了对您评论的回复,因为我发现它更清楚。

sharedPreferences实例不是问题。他们都使用相同的保存数据(“ActivityPREF”)。问题是你有3个OnClickListener实例,并且所有3个实例都持有整数numClicks。所以他们都从0(或以前保存的金额)开始,只增加了本地numClicks。因此,如果我两次点击image1,那个侦听器内的numClicks将会打开2.而其他的仍然是0。

如果您在增加numClicks之前将以下内容添加到onClick方法中,那将会有效:

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

因为它会从保存的值重新加载它。每次单击时都会调用onClick方法中的代码,而不是在实例化OnClickListener时添加的代码。