Как сделать, чтобы добавить кнопку в избранное, используя настройки общего доступа, но без базы данных в Android? - PullRequest
0 голосов
/ 17 мая 2019

Я создаю кнопку переключения для добавления в избранное с помощью общих настроек, но она не работает, когда я нажимаю кнопку «Добавить в избранное», но она работает, но когда я возвращаюсь к другому действию и возвращаюсь к этому действию, моя кнопка не проверяется, и когда я нажимаю снова, его высказывание удаляется из избранного, но оно должно быть отмечено как избранное, потому что я уже отметило его как избранное

XML

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".BenefitDescriptionActivity">

    <ToggleButton
        android:id="@+id/favouritetogglebuttonID"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:textOff=""
        android:textOn=""
        app:layout_constraintBottom_toTopOf="@+id/benefitdescriptionscrollviewID"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/benefitimageviewID" />

</android.support.constraint.ConstraintLayout>

Java

import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import android.widget.ToggleButton;

import static android.text.Html.FROM_HTML_MODE_COMPACT;

public class BenefitDescriptionActivity extends AppCompatActivity {

    private ToggleButton favouriteToggleButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_benefit_description);

        favouriteToggleButton = (ToggleButton)findViewById(R.id.favouritetogglebuttonID);
        favouriteToggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.ic_favorite_border_black_24dp));
        favouriteToggleButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                boolean isFavourite = readstate();
                if (isFavourite) {                 favouriteToggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.ic_favorite_black_24dp));
Toast.makeText(BenefitDescriptionActivity.this,"Added to favorites",Toast.LENGTH_SHORT).show();
                    isFavourite = false;
                    savestate(isFavourite);
                }
                else {
                    favouriteToggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.ic_favorite_border_black_24dp));
Toast.makeText(BenefitDescriptionActivity.this,"Removed from favorites",Toast.LENGTH_SHORT).show();
                    isFavourite = true;
                    savestate(isFavourite);
                }
            }
        });

    private void savestate(boolean isFavourite){
        SharedPreferences aSharedPreferences = this.getSharedPreferences("Favourite", Context.MODE_PRIVATE);
        SharedPreferences.Editor aSharedPreferencesEdit = aSharedPreferences.edit();
        aSharedPreferencesEdit.putBoolean("State",isFavourite);
        aSharedPreferencesEdit.apply();
    }
    private boolean readstate(){
        SharedPreferences asharedPreferences = this.getSharedPreferences("Favourite",Context.MODE_PRIVATE);
        return asharedPreferences.getBoolean("State",true);
    }
}

Ответы [ 4 ]

1 голос
/ 17 мая 2019

Вы всегда устанавливаете фиксированный фон для вашего favouriteToggleButton, вам нужно прочитать значение SharedPreferences State и установить фон для вашего favouriteToggleButton, просто добавьте эти строки в свою деятельность

  @Override
    protected void onResume() {
        super.onResume();
        if (! readstate()) {
            favouriteToggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.ic_favorite_border_black_24dp));
        }
        else {
            favouriteToggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.ic_favorite_black_24dp));
        }
0 голосов
/ 17 мая 2019

Я добавил несколько комментариев в код, они могут помочь вашему приложению работать лучше.

А в коде вы можете заменить AsyncTask другими инструментами.

Просто запретите выполнять работу ввода-вывода в потоке пользовательского интерфейса.

import android.content.Context;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
import android.widget.ToggleButton;

import java.lang.ref.WeakReference;

public class BenefitDescriptionActivity extends AppCompatActivity {

    private ToggleButton favouriteToggleButton;
    private boolean favourite = false;
    private CheckAsyncTask task;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_benefit_description);

        favouriteToggleButton = (ToggleButton) findViewById(R.id.favouritetogglebuttonID);
        favouriteToggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.ic_favorite_border_black_24dp));
        favouriteToggleButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //use a variable, not read file every time click
                if (favourite) {
                    favouriteToggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.ic_favorite_black_24dp));
                    Toast.makeText(BenefitDescriptionActivity.this, "Added to favorites", Toast.LENGTH_SHORT).show();
                    favourite = false;
                    savestate(favourite);
                } else {
                    favouriteToggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.ic_favorite_border_black_24dp));
                    Toast.makeText(BenefitDescriptionActivity.this, "Removed from favorites", Toast.LENGTH_SHORT).show();
                    favourite = true;
                    savestate(favourite);
                }
            }
        });
    }

    @Override
    public void onResume() {
        super.onResume();
        //when activity visible, read boolean value from file and set button state
        if (task == null) {
            task = new CheckAsyncTask(favouriteToggleButton);
        }
        task.execute();
    }

    @Override
    protected void onStop() {
        super.onStop();
        //stop task when activity invisible, prevent memory leak
        if (task != null) {
            task.cancel(true);
        }
    }

    // you also can execute savestate in a background thread
    private void savestate(boolean isFavourite) {
        SharedPreferences aSharedPreferences = getSharedPreferences("Favourite", Context.MODE_PRIVATE);
        SharedPreferences.Editor aSharedPreferencesEdit = aSharedPreferences.edit();
        aSharedPreferencesEdit.putBoolean("State", isFavourite);
        aSharedPreferencesEdit.apply();
    }

    private static class CheckAsyncTask extends AsyncTask<Void, Void, Boolean> {

        private WeakReference<ToggleButton> buttonWeakReference;

        public CheckAsyncTask(ToggleButton button) {
            buttonWeakReference = new WeakReference<>(button);
        }

        @Override
        protected Boolean doInBackground(Void... voids) {
            //do you read file job in background thread may perform better
            if (buttonWeakReference.get() != null) {
                SharedPreferences asharedPreferences = buttonWeakReference.get().getContext().getSharedPreferences("Favourite", Context.MODE_PRIVATE);
                favorite = asharedPreferences.getBoolean("State", true);
                return favorite;
            }

            return false;
        }

        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);
            //got read file result set Button state in UI thread
            if (aBoolean && buttonWeakReference != null && buttonWeakReference.get() != null) {
                buttonWeakReference.get().setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.ic_favorite_black_24dp));
            }
        }
    }

}

0 голосов
/ 17 мая 2019

Кажется, вы не устанавливаете значение, сохраненное при возвращении к занятию. Вам необходимо проверить и установить его в onResume. Также измените свой код в onClickListener следующим образом:

  favouriteToggleButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    boolean isFavourite = readstate();
                    if (!isFavourite) {                 favouriteToggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.ic_favorite_black_24dp));
                        Toast.makeText(BenefitDescriptionActivity.this,"Added to favorites",Toast.LENGTH_SHORT).show();
                        isFavourite = true;
                        savestate(isFavourite);
                    }
                    else {
                        favouriteToggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.ic_favorite_border_black_24dp));
                        Toast.makeText(BenefitDescriptionActivity.this,"Removed from favorites",Toast.LENGTH_SHORT).show();
                        isFavourite = false;
                        savestate(isFavourite);
                    }
                }
            });


        }
        private void savestate(boolean isFavourite){
            SharedPreferences aSharedPreferences = this.getSharedPreferences("Favourite", Context.MODE_PRIVATE);
            SharedPreferences.Editor aSharedPreferencesEdit = aSharedPreferences.edit();
            aSharedPreferencesEdit.putBoolean("State",isFavourite);
            aSharedPreferencesEdit.apply();
        }
        private boolean readstate(){
            SharedPreferences asharedPreferences = this.getSharedPreferences("Favourite",Context.MODE_PRIVATE);
            return asharedPreferences.getBoolean("State",false);
        }

        @Override
        protected void onResume() {
            super.onResume();
            boolean isFavourite = readstate();
            Log.e("main","value = " + isFavourite);
            if (!isFavourite) {
                favouriteToggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.ic_favorite_border_black_24dp));
            }
            else {
                favouriteToggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.ic_favorite_black_24dp));
            }
        }
0 голосов
/ 17 мая 2019

Попробуйте установить

    favouriteButton.setChecked(true);   //or false depending

у вас на ClickListener

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...