2011-10-31 235 views
2

我正在開發一個Android語言字典應用程序。我正在考慮一個收藏夾按鈕,它分兩個階段工作:如何操作:添加到收藏夾並查看收藏列表

  1. 短暫的點擊會將當前顯示的單詞添加到收藏夾列表中;
  2. 和長按可以讓用戶查看收藏夾列表(添加單詞)。

我想知道這是否可能,如果是的話,請你解釋一下怎麼做?

注意:直到現在,我只成功地嚮應用程序添加了收藏夾圖像按鈕,並且在短按時,它會顯示:「已選擇添加到收藏夾中的字」。

非常感謝您提前。

回答

2

假設,比如說,public class FavViewActivity extends ListActivity,你只需添加OnLongClickListener相同的方式,您添加的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; 
     } 
    }); 

在您的分貝,保持一個最喜歡的表格,列出了ID:中所標記的話小號作爲收藏夾。

對於創建一個新的活動,如FavViewActivity,有很多指導。

  • Here是其中之一。
  • Here是StackOverflow上的一個。
  • Here是文檔。

如需更多幫助,請更具體地瞭解一下,並添加您迄今嘗試過的內容。^_^

0

[已更新] @JOG:非常感謝。我設法使ViewHistory工作,但還沒有想出如何查看收藏夾列表。爲了更具體,請找到隨附我的ContentView文件:

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


} 
+0

我更新了我的文章,以反映您的代碼。我必須要求你更具體地說明什麼是不工作的。究竟你在哪裏遇到問題? – JOG

+0

@JOG:你很花時間幫助我。實際上,不起作用的是:**當長按按鈕**時,添加到收藏夾的單詞列表不會顯示。作爲一個測試,我試圖將「SearchActivity.class」更改爲「HistoryView.class」(此類已經定義),並且長按時收藏夾按鈕可以工作:它調用歷史記錄。所以我想我必須添加收藏夾類,不是嗎?非常感謝。 –

+0

是的,如果要在全屏頁面中顯示收藏夾,則需要通過擴展活動類來創建新類。首先,您必須在點擊時將收藏夾保存在數據庫中(或存儲任何東西的地方),然後在新的活動中從數據庫中獲取它們。我不知道任何內置的最喜歡的功能,可以爲你做到這一點。我沒有讀取所有的代碼,因爲我猜沒有什麼是錯的,你只需要繼續編碼:)我在我的答案中添加了一些鏈接。另外,請看這個:http://stackoverflow.com/questions/how-to-ask – JOG