2

I'm developing an Android language dictionary app. I'm thinking of a Favourites button that works in two phases:

  1. a short click will add the currently viewed word into the Favourites list;
  2. and a long click will allow user to view the Favourites list (of added words).

I wonder if this is possible, and if yes could you please explain how to do it?

NB: Till now I've only succeeded in adding a Favourites image button to the app, and when short-clicked, it says: "Chosen Word Added to Favourites".

Thank you very much in advance.

Niamh Doyle
  • 1,909
  • 7
  • 30
  • 42

3 Answers3

2

Assuming, say, public class FavViewActivity extends ListActivity, you just add the OnLongClickListener the same way as you added the OnClickListener:

btnAddFavourite = (ImageButton) findViewById(R.id.btnAddFavourite);

btnAddFavourite.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // Add code here to save the favourite, e.g. in the db.
        }
    });

btnAddFavourite.setOnLongClickListener(new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {

            // Open the favourite Activity, which in turn will fetch the saved favourites, to show them.
            Intent intent = new Intent(getApplicationContext(), FavViewActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            getApplicationContext().startActivity(intent);

            return false;
        }
    });

In your db, keep a favourite table listing the id:s of the words that are marked as favourites.

For creating a new Activity, like FavViewActivity, there are plenty of guides around.

  • Here is one.
  • Here is one on StackOverflow.
  • Here is the documentation.

For more help, please be more specific about what, and also add what you have tried so far. ^_^

Community
  • 1
  • 1
JOG
  • 5,590
  • 7
  • 34
  • 54
1

This method can be possible using room database, you can use Add To favorites and Display Favourites in RecyclerView You can add to favorites data save in room database and retrieve data in Recyclerview.

enter image description here

 viewHolder.fav_btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
           FavoriteList favoriteList=new FavoriteList();

           int id=productList.getId();
           String image=productList.getImage();
           String name=productList.getMame();

           favoriteList.setId(id);
           favoriteList.setImage(image);
           favoriteList.setName(name);

           if (MainActivity.favoriteDatabase.favoriteDao().isFavorite(id)!=1){
viewHolder.fav_btn.setImageResource(R.drawable.ic_favorite);
               MainActivity.favoriteDatabase.favoriteDao().addData(favoriteList);

           }else {
              viewHolder.fav_btn.setImageResource(R.drawable.ic_favorite_border_black_24dp);
               MainActivity.favoriteDatabase.favoriteDao().delete(favoriteList);

           }

    }
});

Room database and all code, click here

input
  • 7,503
  • 25
  • 93
  • 150
0

[Updated] @JOG: Thanks a lot. I have managed to make ViewHistory work but still haven't figured out how to view the Favourite list. To be more specific, please find enclosed my ContentView file:

package viettien.kadict;

import java.util.ArrayList;
import java.util.Arrays;

import viettien.kadict.R;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageButton;
import android.widget.Toast;

public class ContentView extends Activity {

static final private String CONTENT_TAG = "[Kadict - Content]";

static final private int SHOW_HISTORY_CODE = 0;
static final private int SHOW_FAVOURITE_CODE = 1;

static final private int MENU_BACK = Menu.FIRST;
static final private int MENU_FOWARD = Menu.FIRST+1;
static final private int MENU_LIST = Menu.FIRST+2;
static final private int MENU_HISTORY = Menu.FIRST+3;

private static final String MIMETYPE = "text/html";
private static final String ENCODING = "UTF-8";

private WebView wvContent = null;
private ImageButton btnGoBack = null;
private ImageButton btnGoForward = null;
private ImageButton btnShowHistory = null;
private ImageButton btnAddFavourite = null;

private String mCurrentWord;
private String mSelectedDB;
//private String mSelectedDBName;
private String mContentStyle;
private int mCurrentWordId;
private int mCurrentHistoryIndex = -1;

Menu menu = null;

private ArrayList<String> mWordHistory = null;

private SharedPreferences prefs;

private ProgressDialog pd = null;

// create Menu for Program
@Override
public boolean onCreateOptionsMenu(Menu menu) {
  super.onCreateOptionsMenu(menu);

  Log.i(CONTENT_TAG, "menu drawed!!");
  // Group ID
  int groupId = 0;

  // The order position of the item
  int menuItemOrder = Menu.NONE;
  this.menu=menu;
  // Added extra items to make sure there's more than six to 
  // force the extended menu to appear.
  menu.add(groupId, MENU_BACK, menuItemOrder, R.string.menuGoBack);
  menu.add(groupId, MENU_FOWARD, menuItemOrder, R.string.menuGoForward);
  menu.add(groupId, MENU_LIST, menuItemOrder, R.string.menuList);
  menu.add(groupId, MENU_HISTORY, menuItemOrder, R.string.menuHistory);

  return true;
}

// process event select Menu
public boolean onOptionsItemSelected(MenuItem item) {
    super.onOptionsItemSelected(item);

    // Find which menu item has been selected
    switch (item.getItemId()) {
        case (MENU_BACK): 
        {    
            goBack();
            break;
        }
        case (MENU_FOWARD): 
        {
            goForward();
            break;
        }
        case (MENU_LIST): 
        {
            //menuDictionaryManager();
            menuList();
            break;
        }
        case (MENU_HISTORY):
        {
            break;              
        }
    }
    return true;
}

public void menuList()
{
    /*
     * TODO
     * - save history list
     */
    Intent i = new Intent();
    i.putExtra("word", mCurrentWord);
    setResult(RESULT_OK,i);
    finish();
}

public void goBack()
{
    Log.i(CONTENT_TAG,"go back");
    String content = getHistoryContent("back");
    showContent(content);
}

public void goForward()
{
    Log.i(CONTENT_TAG,"go foward");
    String content = getHistoryContent("back");
    showContent(content);
}

@Override
public void onPause()
{
    super.onPause();
    saveHistoryToPreferences();
}

public void saveHistoryToPreferences()
{
    if (prefs.getBoolean("saveHistory", true) && mWordHistory != null && mWordHistory.size() >= 1)
    {
        StringBuilder sbHistory = new StringBuilder();
        for (String item : mWordHistory)
        {
            sbHistory.append(item);
            sbHistory.append(",");
        }

        String strHistory = sbHistory.substring(0, sbHistory.length()-1);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString("history", strHistory);
        editor.commit();
        //Log.i(CONTENT_TAG,"history = " + strHistory);
        Log.i(CONTENT_TAG,"History saved!");
    }
}

public void loadHistoryFromPreferences()
{
    if (prefs.getBoolean("saveHistory", true))
    {
        String strHistory = prefs.getString("history", "");
        Log.i(CONTENT_TAG, "History loaded");
        if (strHistory != null && !strHistory.equals(""))
        {
            mWordHistory = new ArrayList<String>(Arrays.asList(strHistory.split(",")));
        }
        else
        {
            if (mWordHistory == null)
            {
                mWordHistory = new ArrayList<String>();
            }
            else
            {
                mWordHistory.clear();
            }
        }
    }
    else
    {
        if (mWordHistory == null)
        {
            mWordHistory = new ArrayList<String>();
        }
        else
        {
            mWordHistory.clear();
        }
    }
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE); 

    setContentView(R.layout.content);
    //Log.i(CONTENT_TAG,".................onCreate.................");
    Intent i = this.getIntent();

    int wordId = i.getIntExtra("id", -1);
    mCurrentWord = i.getStringExtra("word");
    mSelectedDB = i.getStringExtra("db");
    mContentStyle = i.getStringExtra("style");
    //Log.i(CONTENT_TAG,"Style from intent = " + mContentStyle);
    //Log.d(CONTENT_TAG,"current word = " + mCurrentWord);
    prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

    loadHistoryFromPreferences();

    wvContent = (WebView) findViewById(R.id.wvContent);
    initWebview();
    String content = getContentById(wordId);
    showContent(content);

    btnShowHistory = (ImageButton) findViewById(R.id.btnShowHistory);
    btnShowHistory.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Log.i(CONTENT_TAG, "Start showing history..");
/*              Intent i = new Intent(v.getContext(), HistoryView.class);
            HistoryList hl = new HistoryList(mWordHistory);
            i.putExtra("history", hl);*/
            startActivityForResult(new Intent(v.getContext(),HistoryView.class), SHOW_HISTORY_CODE);
            //showHistory();
        }
    });

    btnGoBack = (ImageButton) findViewById(R.id.btnGoBack);
    btnGoBack.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Log.d(CONTENT_TAG, "Start going back");
            {
                String content = getHistoryContent("back");
                if (content == null) // end Activity now
                {
                    menuList();
                }
                else // go back to previous word
                {
                    showContent(content);
                }
                menuList();
            }

    }});

    btnGoForward = (ImageButton) findViewById(R.id.btnGoForward);
    btnGoForward.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Log.d(CONTENT_TAG, "Start going forward");
            goForward();
        }
    });

    btnAddFavourite = (ImageButton) findViewById(R.id.btnAddFavourite);

    btnAddFavourite.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast toast = Toast.makeText(ContentView.this, R.string.messageWordAddedToFarvourite, Toast.LENGTH_SHORT);
                toast.show();
            }
        });

    btnAddFavourite.setOnLongClickListener(new View.OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {

                Intent intent = new Intent(getApplicationContext(), SearchActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                getApplicationContext().startActivity(intent);

                return false;
            }
        });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode)
    {
        case SHOW_HISTORY_CODE:
            Log.i(CONTENT_TAG,"resultCode = " + resultCode);
            if (resultCode == RESULT_OK) // cleared
            {
                if (data == null)
                {
                    //loadHistoryFromPreferences();
                    mWordHistory.clear();
                    Log.i(CONTENT_TAG,"History cleared");
                }
                else
                {
                    int id = data.getIntExtra("wordId", 0);
                    String dict = data.getStringExtra("dict");
                    Log.i(CONTENT_TAG,"id = " + id + " | dict = " + dict);
                    if (id > 0 && dict != null)
                    {
                        mSelectedDB = dict;
                        String content = getContentById(id);
                        //initWebview();
                        showContent(content);
                    }
                }
            }
            break;
        case SHOW_FAVOURITE_CODE:
            break;
    }
}

/*    @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    //super.onKeyDown(keyCode, event);
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        // When the user center presses, let them pick a contact.
        Log.d(CONTENT_TAG,"Backkey pressed !!!");
        if (mWordHistory != null && mWordHistory.size() > 1 && mCurrentHistoryIndex != 0)
        {
            String content = getHistoryContent("back");
            if (content == null) // end Activity now
            {
                menuList();
            }
            else // go back to previous word
            {
                showContent(content);
            }
        }
        else
        {
            menuList();
        }
        return true;
    }
    return false;
}*/


public void initWebview()
{
    setContentView(R.layout.content);
    wvContent = (WebView) findViewById(R.id.wvContent);
    wvContent.setBackgroundColor(Color.argb(250, 250, 250, 250));

    wvContent.setWebViewClient(new WebViewClient() 
    {
        public void onPageFinished(WebView view, String url)
        {
            if (pd != null)
            {
                pd.dismiss();
                pd = null;
            }
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url)
        {
            Log.i(CONTENT_TAG,"WebView link clicked; url = " + url);
            try
            {
                String arrUrlPart[] = url.split("://");

                if (arrUrlPart[0].equals("entry"))
                {
                    String content = getContentByWord(arrUrlPart[1]);
                    showContent(content);
                }
                else if (arrUrlPart[0].equals("http"))
                {
                     try {
                         /*Intent i = new Intent();

                         ComponentName comp = new ComponentName(
                                          "com.google.android.browser",
                                                 "com.google.android.browser.BrowserActivity");
                         i.setComponent(comp);
                         i.setAction("android.intent.action.VIEW");
                         i.addCategory("android.intent.category.BROWSABLE");
                         ContentURI uri = new ContentURI(url);
                         i.setData(uri);
                         startSubActivity(i, 2);*/
                         startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));                              
                     } catch (Exception ex) {
                         // TODO Auto-generated catch block
                         ex.printStackTrace();
                     }                      
                }
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }
            return true;
        }
    });
}

public String getHistoryContent(String type)
{
    String currentTerm = mSelectedDB + ":" + mCurrentWordId + ":" + mCurrentWord;

    Log.i(CONTENT_TAG,"currentTerm = " +currentTerm);
    if (mWordHistory == null || mWordHistory.isEmpty())
    {
        return null;
    }
    int pos = mWordHistory.indexOf(currentTerm);
    Log.i(CONTENT_TAG,"pos = " + pos);
    if (pos <= 0)
    {
        pos = mWordHistory.size();
    }
    String item = null;
    String searchTerm;

    if (type.equals("back"))
    {
        try
        {
            for (int i = pos-1; i >= 0 ; i--)
            {
                searchTerm = mWordHistory.get(i);
                searchTerm = searchTerm.substring(0,searchTerm.indexOf("::"));
                Log.i(CONTENT_TAG,"item = " + mWordHistory.get(i) + " - searchTerm = " + searchTerm);
                if (searchTerm.equals(mSelectedDB))
                {
                    item = mWordHistory.get(i);  
                    mCurrentHistoryIndex = i;
                    break;
                }
            }
        }
        catch (Exception ex)
        {
            Log.i(CONTENT_TAG,"Error in finding history entry");
        }

    }
    else
    {
        try
        {
            for (int i = pos; i < mWordHistory.size() ; i++)
            {
                searchTerm = mWordHistory.get(i);
                searchTerm = searchTerm.substring(0,searchTerm.indexOf("::"));
                Log.i(CONTENT_TAG,"item = " + mWordHistory.get(i) + " - searchTerm = " + searchTerm);
                if (searchTerm.equals(mSelectedDB))
                {
                    item = mWordHistory.get(i);  
                    mCurrentHistoryIndex = i;
                    break;
                }
            }
        }
        catch (Exception ex)
        {
            Log.i(CONTENT_TAG,"Error in finding history entry");
        }
    }
    if (item != null) // found previous item
    {
        Log.i(CONTENT_TAG,"item index = " + mCurrentHistoryIndex);
        String arrPart[] = item.split(":");

        Uri uri = Uri.parse("content://viettien.kadict.KadictProvider/dict/" + arrPart[0] + "/contentId/" + arrPart[1]);

        Log.i(CONTENT_TAG,"History uri = " + uri.toString());
        Cursor result = managedQuery(uri,null,null,null,null);

        String content;
        if (result != null)
        {
            result.moveToFirst();
            content = Utility.decodeContent(result.getString(result.getColumnIndex("content")));

            content = formatContent(content);

            mSelectedDB = arrPart[0];
            mCurrentWordId = Integer.parseInt(arrPart[1]);
            mCurrentWord = arrPart[2];
            return content;
        }
        else
        {
            return null;
        }
    }
    else
    {
        return null;
    }
}

public String getContentById(int id)
{
    Uri uri = Uri.parse("content://viettien.kadict.KadictProvider/dict/" + mSelectedDB + "/contentId/" + id);

    Cursor result = managedQuery(uri,null,null,null,null);

    String content;
    if (result != null)
    {
        result.moveToFirst();
        content = Utility.decodeContent(result.getString(result.getColumnIndex("content")));
        mCurrentWordId = result.getInt(result.getColumnIndex("id"));
        mCurrentWord = result.getString(result.getColumnIndex("word"));
    }
    else // Word not found
    {
        content = getString(R.string.errorWordNotFound);
        mCurrentWordId = -1;
        mCurrentWord = "";
    }
    content = formatContent(content);

    return content;
}

public String getContentByWord(String word)
{
    Uri uri = Uri.parse("content://viettien.kadict.KadictProvider/dict/" + mSelectedDB + "/contentWord/" + word);

    Log.i(CONTENT_TAG,"uri = " + uri.toString());
    Cursor result = managedQuery(uri,null,null,null,null);

    String content;
    if (result != null && result.getCount() > 0)
    {
        result.moveToFirst();
        content = Utility.decodeContent(result.getString(result.getColumnIndex("content")));
        mCurrentWordId = result.getInt(result.getColumnIndex("id"));
        mCurrentWord = result.getString(result.getColumnIndex("word"));
    }
    else
    {
        content = getString(R.string.errorWordNotFound) + word;
        mCurrentWordId = -1;
        mCurrentWord = "";
    }
    content = formatContent(content);

    return content;
}

public void saveHistory()
{
    String item = mSelectedDB + "::" + mCurrentWordId + "::" + mCurrentWord;
    if (mWordHistory.indexOf(item) == -1 && mCurrentWordId != -1) // new item
    {
        mWordHistory.add(item);
        mCurrentHistoryIndex = mWordHistory.size();

        if (menu != null)
        {
            menu.findItem(MENU_FOWARD).setEnabled(false);
            if (mWordHistory.size() == 1)
            {
                menu.findItem(MENU_BACK).setEnabled(false);
            }
        }
        //Log.i(CONTENT_TAG,"new item added " + item);
    }
}

public String formatContent(String content)
{
    StringBuilder htmlData = new StringBuilder();
    htmlData.append("<html><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/>\n");
    if (mContentStyle != null && !mContentStyle.equals(""))
    {
        htmlData.append("<head><style type=\"text/css\">"+mContentStyle+"</style></head>\n");
    }
    htmlData.append("<body><font face=\"Arial\">");

    htmlData.append(content);

    htmlData.append("</font></body></html>");

    return htmlData.toString();
}

public void showContent(String content)
{
    if (content != null)
    {
        pd = ProgressDialog.show(this, "Working...", "Loading content", true,false);            
        saveHistory();
        wvContent.loadDataWithBaseURL (null, content, MIMETYPE, ENCODING,"about:blank");
    }
}


}
Niamh Doyle
  • 1,909
  • 7
  • 30
  • 42
  • I updated my post to reflect your code. I have to ask you to be more specific about what is not working. Exactly where are you running into problems? – JOG Nov 01 '11 at 10:12
  • @JOG: That's very kind of you spending time helping me. In fact, what is not working is: **the list of words added to Favourites does not appear when the button is long-clicked**. As a test, I tried to change "SearchActivity.class" to "HistoryView.class" (this class is already defined) and the Favourites button does work when long-clicked: it calls the History. So I guess I have to add a Favourites class, don't I? Many thanks. – Niamh Doyle Nov 01 '11 at 10:45
  • Yes, you would need to create a new class by extending the Activity class if you want to show the favourites in a full screen page. First, you would have to save your favourites in the database (or wherever you save stuff) when clicking, and then fetch them from the database in your new activity. I am not aware of any built in favourite functionality that could do this for you. I did not read all your code as I guess nothing is wrong, you just need to keep on coding :) I added some links in my answer. Also, please see this: http://stackoverflow.com/questions/how-to-ask – JOG Nov 01 '11 at 16:57
  • @JOG: This is a very tough task now but I will try my best to do it :). Please allow me to bother you later if I have such tough (or "easy") questions. Thank you very much for all your help. – Niamh Doyle Nov 01 '11 at 17:25
  • No problem! We're all n00bs in the beginning. And feel free to mark my post as answer. ^_^ See the links in my answer. Creating a new activity is not harder than anything you have done so far. – JOG Nov 01 '11 at 23:00