0

我在代码中实现了多个点击监听器。但是,我希望将来自单独图像的每次点击保存在共享首选项的“代码”中。因此,如果在图像 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();
} 
}); 
4

1 回答 1

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 时添加的代码。

于 2013-10-22T23:43:09.067 回答