0

「会場」、都市の場所のリストビューがあります。それをクリックすると、ID を使用して会場ページに移動します。

この会場ページには、+ が付いた小さな追加ボタンがあります。あなたがこれを押すとき、私は必要です:

  • 共有設定から他のお気に入りのリストを取得するために、カンマ区切りの文字列として保存し、整数のリストに変換しました
  • このアイテムのIDを追加
  • 整数のリストをカンマ区切りの文字列に再変換します。
  • この文字列を同じキーの下に保存します。「fav」を使用しました

ボタンの画像をさらに変更すると、+ が - になります。

私はこれを行うことができたと思いました.私のコードは私の投稿の一番下にあります.

今私の問題です、私のお気に入りの文字列は実際には保存されていません。なんらかの理由で (理由がわからない) 会場を開くたびに、共有設定から取得した文字列に null と 333 の 2 つの値があります。スタートアップアクティビティでは、もちろんコミットを使用しましたが、それでも同じ戻り値がありました。特に 333 は非常に奇妙だと思いますが、null を文字列に保存する可能性も排除したと思いました。

今何が起こるか: ボタンをクリックすると、ほとんどの場合、最初は反応しません。2回目くらいで、プロセスをログに記録すると、IDが共有設定に追加され、ボタンがうまく変化しました。次に、別のプレスでは、ほとんどの場合、最初は再び反応がなく、2 回目はお気に入りから削除され、ボタンが変更されます。

しかし、アクティビティを離れて別の ID で同じアクティビティを開くと、文字列には null と 333 の値しかありません。

    final int favID = id;
        btFavourite.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View v) {
                if(isFavourite(favID)){
                    btFavourite.setBackgroundResource(R.drawable.btn_favourites_remove);
                    DeleteFavourite(favID);
                }else{
                    btFavourite.setBackgroundResource(R.drawable.btn_favourites_add);
                    MakeFavourite(favID);
                }

            }
        });

}


     private void SaveFavourites(List<Integer> favs){
            SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            String commSepFavs = IntArrToComSepString(favs);
            editor.putString("favs", commSepFavs);
            editor.commit();
           }

           private List<Integer> LoadFavourites(){
            SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
            String favStr = sharedPreferences.getString("favs", "");
            System.out.println(favStr);
            if (favStr != null){
            return CommaSepStringToIntArr(favStr);
            }else{
                return null;
            }
            }

        public List<Integer> CommaSepStringToIntArr(String input){
               List <Integer> favs= new ArrayList<Integer>();
                    String[] separated = null;
                separated = input.split(",");
                 System.out.println("separated lengte " + separated.length);
                 String tijdelSep;
                for (int i=0;i<separated.length;i++){
                     tijdelSep = separated[i].replace(",","").trim();
                    System.out.println("tijdelSep "+i+" = " + tijdelSep);
                if(tijdelSep != null && tijdelSep.equals("")==false &&tijdelSep.equals("null")==false){
                    favs.add(Integer.parseInt(tijdelSep));
                }
                }
            return favs;
            }

           public String IntArrToComSepString(List<Integer> favs){
               String comSepFavs = null;
               for (int i=0;i<favs.size();i++){
                   comSepFavs = comSepFavs +","+String.valueOf(favs.get(i));
               }
            return comSepFavs;  
           }

           public boolean isFavourite(int id){
               boolean isFav = false;
               List<Integer> favs = LoadFavourites();
               for (int i=0;i<favs.size();i++){
                    if(favs.get(i)==id){
                        isFav=true;
                    }
                }
               return isFav;               
           }

           public void MakeFavourite(int id){
               List<Integer> favs = LoadFavourites();
               List<Integer> newfavs = new ArrayList<Integer>();
               for (int i=0;i<favs.size();i++){
                   newfavs.add(favs.get(i));
               }
               newfavs.add(id);
               SaveFavourites(newfavs);
           }

           public void DeleteFavourite(int id){
               List<Integer> favs = LoadFavourites();
               List<Integer> newfavs = new ArrayList<Integer>();
               int j=0;
               for (int i=0;i<favs.size();i++){
                   if(favs.get(i) != id){
                   newfavs.add(favs.get(i));
                   j++;
                   }
               }
               SaveFavourites(newfavs);
           }
4

2 に答える 2

0

よくわかりませんが、問題がある可能性がありますSharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);

私の知る限り、次のようなものを使用する必要があります:SharedPreferences sharedPreferences = getPreferences("prefs_file_name", MODE_PRIVATE);あなたが持っている行の代わりに。

デフォルトの共有設定にも設定を保存できます。使用するSharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);

getDefaultSharedPreferences (Context context)メソッドの仕様を見てみましょう。

于 2012-07-29T22:26:26.560 に答える
0

もっと (つまり、あなたのすべての活動) コードを投稿していただけますか? それに加えて、DBを使用する必要があると思います。共有設定への呼び出しは問題ありません(呼び出しは、アクティビティ名を文字列としてsharedPreferences(String、int)を呼び出すだけです。このファイルは、アクティビティを開くたびに保持されます。共有設定は、デバイスに保存されているフラット ファイルにすぎません。

いくつかのこと:1)editor.clear()を実行したとき-コミットしましたか、2)そのエディターで他の変更を加えましたか(例:editor.putString()など)。実際にファイルをクリアするのではなく、ファイルをクリアしてから、そのエディター インスタンスに追加されたものを挿入します。

2) null と "" は、文字列では同じものではありません。そのため、文字列を null に初期化すると null が返されます。

あなたのコードをもっと投稿できれば、私はもっと助けようとすることができます. また、ID はどのようにアクティビティに渡されますか?

于 2012-07-29T23:03:23.733 に答える