- 浏览: 2224388 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (1240)
- mac/IOS (287)
- flutter (1)
- J2EE (115)
- android基础知识 (582)
- android中级知识 (55)
- android组件(Widget)开发 (18)
- android 错误 (21)
- javascript (18)
- linux (70)
- 树莓派 (18)
- gwt/gxt (1)
- 工具(IDE)/包(jar) (18)
- web前端 (17)
- java 算法 (8)
- 其它 (5)
- chrome (7)
- 数据库 (8)
- 经济/金融 (0)
- english (2)
- HTML5 (7)
- 网络安全 (14)
- 设计欣赏/设计窗 (8)
- 汇编/C (8)
- 工具类 (4)
- 游戏 (5)
- 开发频道 (5)
- Android OpenGL (1)
- 科学 (4)
- 运维 (0)
- 好东西 (6)
- 美食 (1)
最新评论
-
liangzai_cool:
请教一下,文中,shell、C、Python三种方式控制led ...
树莓派 - MAX7219 -
jiazimo:
...
Kafka源码分析-序列5 -Producer -RecordAccumulator队列分析 -
hp321:
Windows该命令是不是需要安装什么软件才可以?我试过不行( ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
hp321:
Chenzh_758 写道其实直接用一下代码就可以解决了:JP ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
huanghonhpeng:
大哥你真强什么都会,研究研究。。。。小弟在这里学到了很多知识。 ...
android 浏览器
运行结果:
Bookmarker.java:
BookmarkItem.java:
BookmarkAdapter.java:
bookmark_item.xml:
main.xml:
strings.xml:
下面是用到的一些图片:








Bookmarker.java:
package com.iaiai; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.ContentResolver; import android.content.ContentValues; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.provider.Browser; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageButton; import android.widget.ListView; /** * * <p> * Title: Bookmarker.java * </p> * <p> * E-Mail: 176291935@qq.com * </p> * <p> * QQ: 176291935 * </p> * <p> * Http: iaiai.iteye.com * </p> * <p> * Create time: 2011-8-29 * </p> * * @author 丸子 * @version 0.0.1 */ public class Bookmarker extends Activity implements OnItemClickListener, OnClickListener { /** Called when the activity is first created. */ private ListView mListView; private BookmarkAdapter bookmarkAdapter; private ImageButton upButton; private ImageButton downButton; private ImageButton deleteButton; private ImageButton launchButton; private ImageButton topButton; private ImageButton bottomButton; private static final int DIALOG_YES_NO_MESSAGE = 1; private static final int DIALOG_WELCOME = 2; private int currentPos = -1; private static final String PREFS_NAME = "BookmarkerPrefs"; private static final String LAUNCHED_KEY = "LAUNCHED"; private static final int MENU_ABOUT = 0; private static final int MENU_ADD = 1; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); ContentValues inputValue = new ContentValues(); inputValue.put(android.provider.Browser.BookmarkColumns.BOOKMARK, 1); inputValue.put(android.provider.Browser.BookmarkColumns.TITLE, "丸子"); inputValue.put(android.provider.Browser.BookmarkColumns.URL, "http://iaiai.iteye.com"); ContentResolver cr = getContentResolver(); Uri uri = cr.insert(android.provider.Browser.BOOKMARKS_URI, inputValue); bookmarkAdapter = new BookmarkAdapter(this, "");// new // ArrayAdapter<Bookmark>(this, // android.R.layout.simple_list_item_single_choice,bookmarks); mListView = ((ListView) findViewById(R.id.mylistview)); mListView.setAdapter(bookmarkAdapter); mListView.setOnItemClickListener(this); upButton = (ImageButton) findViewById(R.id.upbutton); downButton = (ImageButton) findViewById(R.id.downbutton); deleteButton = (ImageButton) findViewById(R.id.deletebutton); launchButton = (ImageButton) findViewById(R.id.launchbutton); topButton = (ImageButton) findViewById(R.id.topbutton); bottomButton = (ImageButton) findViewById(R.id.bottombutton); upButton.setOnClickListener(this); downButton.setOnClickListener(this); deleteButton.setOnClickListener(this); launchButton.setOnClickListener(this); topButton.setOnClickListener(this); bottomButton.setOnClickListener(this); // if we have some bookmarks select the first and start everything if (bookmarkAdapter.getCount() > 0) { bookmarkAdapter.initialiseAllRows(); currentPos = 0; bookmarkAdapter.setSelected(currentPos); } // Make sure the welcome message only appears on first launch SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); if (settings != null) { boolean launchedPreviously = settings.getBoolean(LAUNCHED_KEY, false); if (!launchedPreviously) { showDialog(DIALOG_WELCOME); SharedPreferences.Editor editor = settings.edit(); editor.putBoolean(LAUNCHED_KEY, true); editor.commit(); } } } /** * Invoked during init to give the Activity a chance to set up its Menu. * * @param menu * the Menu to which entries may be added * @return true */ @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, MENU_ADD, 0, "Add New Bookmark").setIcon( android.R.drawable.ic_menu_info_details); menu.add(0, MENU_ABOUT, 1, R.string.menu_about).setIcon( android.R.drawable.ic_menu_info_details); return true; } /** * Invoked when the user selects an item from the Menu. * * @param item * the Menu entry which was selected * @return true if the Menu item was legit (and we consumed it), false * otherwise */ @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == MENU_ABOUT) { showDialog(DIALOG_WELCOME); return true; } else if (item.getItemId() == MENU_ADD) { Browser.saveBookmark(this, "New Bookmark", "http://"); bookmarkAdapter.notifyDataSetChanged(); return true; } else return false; } public void onItemClick(AdapterView<?> arg0, View view, int position, long id) { currentPos = position; bookmarkAdapter.setSelected(position); } public void onClick(View v) { if (v == upButton && currentPos > 0) { bookmarkAdapter.moveItemUp(currentPos); currentPos--; } else if (v == downButton && currentPos >= 0 && currentPos < bookmarkAdapter.getCount() - 1) { bookmarkAdapter.moveItemDown(currentPos); currentPos++; } else if (v == deleteButton) { showDialog(DIALOG_YES_NO_MESSAGE); } else if (v == topButton) { currentPos = bookmarkAdapter.moveToTop(currentPos); } else if (v == bottomButton) { currentPos = bookmarkAdapter.moveToBottom(currentPos); } else if (v == launchButton) { String url = bookmarkAdapter.getUrl(currentPos); if (url != null) { Intent i = new Intent("android.intent.action.VIEW", Uri.parse(url)); startActivity(i); } } } protected Dialog onCreateDialog(int id) { if (id == DIALOG_YES_NO_MESSAGE) { return new AlertDialog.Builder(Bookmarker.this) .setIcon(android.R.drawable.ic_dialog_alert) .setTitle("Confirm Delete") .setMessage( "Are you sure you want to delete this bookmark?") .setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { bookmarkAdapter.deleteRow(currentPos); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // do nothing } }).create(); } else if (id == DIALOG_WELCOME) { String message = getString(R.string.welcome); if (bookmarkAdapter.getCount() < 1) { message += getString(R.string.nomarks); } AlertDialog dialog = new AlertDialog.Builder(Bookmarker.this) .create();// new AlertDialog(Bookmarker.this); dialog.setTitle("Welcome"); dialog.setMessage(message); dialog.setButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { if (bookmarkAdapter.getCount() < 1) { finish(); } } }); dialog.setCancelable(true); return dialog; } else return null; } }
BookmarkItem.java:
package com.iaiai; import android.content.Context; import android.graphics.Bitmap; import android.view.LayoutInflater; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; /** * * <p> * Title: BookmarkItem.java * </p> * <p> * E-Mail: 176291935@qq.com * </p> * <p> * QQ: 176291935 * </p> * <p> * Http: iaiai.iteye.com * </p> * <p> * Create time: 2011-8-29 * </p> * * @author 丸子 * @version 0.0.1 */ class BookmarkItem extends RelativeLayout { private TextView mTextView; // title private TextView mUrlText; // url private ImageView mImageView; // favicon private LayoutInflater mFactory; private RelativeLayout mBookmarkItem; /** * Instantiate a bookmark item, including a default favicon. * * @param context * The application context for the item. */ BookmarkItem(Context context) { super(context); mFactory = LayoutInflater.from(context); mFactory.inflate(R.layout.bookmark_item, this); mTextView = (TextView) findViewById(R.id.title); mUrlText = (TextView) findViewById(R.id.url); mImageView = (ImageView) findViewById(R.id.favicon); mBookmarkItem = (RelativeLayout) findViewById(R.id.bookmarkitem); } public void setSelected() { mBookmarkItem.setBackgroundColor(0xFFFF6633); mUrlText.setTextColor(0xFF000000); } public void setUnselected() { mBookmarkItem.setBackgroundColor(0xFF000000); mUrlText.setTextColor(0xFFAAAAAA); } /** * Copy this BookmarkItem to item. * * @param item * BookmarkItem to receive the info from this BookmarkItem. */ /* package */void copyTo(BookmarkItem item) { item.mTextView.setText(mTextView.getText()); item.mUrlText.setText(mUrlText.getText()); item.mImageView.setImageDrawable(mImageView.getDrawable()); } /** * Return the name assigned to this bookmark item. */ /* package */CharSequence getName() { return mTextView.getText(); } /** * Return the TextView which holds the name of this bookmark item. */ /* package */TextView getNameTextView() { return mTextView; } /** * Set the favicon for this item. * * @param b * The new bitmap for this item. If it is null, will use the * default. */ /* package */void setFavicon(Bitmap b) { if (b != null) { mImageView.setImageBitmap(b); } else { mImageView.setImageResource(R.drawable.app_web_browser_sm); } } /** * Set the new name for the bookmark item. * * @param name * The new name for the bookmark item. */ /* package */void setName(String name) { mTextView.setText(name); } /** * Set the new url for the bookmark item. * * @param url * The new url for the bookmark item. */ /* package */void setUrl(String url) { mUrlText.setText(url); } }
BookmarkAdapter.java:
package com.iaiai; import java.io.ByteArrayOutputStream; import java.util.Date; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.database.ContentObserver; import android.database.Cursor; import android.database.DataSetObserver; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.provider.Browser; import android.view.View; import android.view.ViewGroup; import android.webkit.WebIconDatabase; import android.webkit.WebIconDatabase.IconListener; import android.widget.BaseAdapter; /** * * <p> * Title: BookmarkAdapter.java * </p> * <p> * E-Mail: 176291935@qq.com * </p> * <p> * QQ: 176291935 * </p> * <p> * Http: iaiai.iteye.com * </p> * <p> * Create time: 2011-8-29 * </p> * * @author 丸子 * @version 0.0.1 */ class BookmarkAdapter extends BaseAdapter { private Cursor mCursor; private int mCount; private ContentResolver mContentResolver; private ChangeObserver mChangeObserver; private DataSetObserver mDataSetObserver; private boolean mDataValid; private Bookmarker mBookmarker; // Implementation of WebIconDatabase.IconListener private class IconReceiver implements IconListener { public void onReceivedIcon(String url, Bitmap icon) { updateBookmarkFavicon(mContentResolver, url, icon); } } // Instance of IconReceiver private final IconReceiver mIconReceiver = new IconReceiver(); /** * Create a new BrowserBookmarksAdapter. * * @param b * BrowserBookmarksPage that instantiated this. Necessary so it * will adjust its focus appropriately after a search. */ public BookmarkAdapter(Bookmarker b, String curPage) { this(b, curPage, false); } /** * Create a new BrowserBookmarksAdapter. * * @param b * BrowserBookmarksPage that instantiated this. Necessary so it * will adjust its focus appropriately after a search. */ public BookmarkAdapter(Bookmarker b, String curPage, boolean createShortcut) { mDataValid = false; mBookmarker = b; mContentResolver = b.getContentResolver(); mChangeObserver = new ChangeObserver(); mDataSetObserver = new MyDataSetObserver(); // FIXME: Should have a default sort order that the user selects. search(); // FIXME: This requires another query of the database after the // initial search(null). Can we optimize this? Browser.requestAllIcons(mContentResolver, Browser.BookmarkColumns.FAVICON + " is NULL AND " + Browser.BookmarkColumns.BOOKMARK + " == 1", mIconReceiver); } public void initialiseAllRows() { int processed = 0; // ensures each row has a created time while (processed < mCount) { for (int i = 0; i < mCount; i++) { Bundle thisRow = getRow(i, true); Long thisCreateTime = thisRow .getLong(Browser.BookmarkColumns.CREATED); if (thisCreateTime == null || thisCreateTime < 900) { // get createTime of row above and subtract 1000; long createTime = (mCount - i) * 1000; if (i > 0) { Bundle prevRow = getRow(i, true); Long prevCreateTime = prevRow .getLong(Browser.BookmarkColumns.CREATED); if (prevCreateTime != null && prevCreateTime > 1001) { createTime = prevCreateTime - 1000; } } thisRow.putLong(Browser.BookmarkColumns.CREATED, createTime); updateRow(thisRow, true); break;// underlying dataset has updated so quit the loop and // start again } processed = i + 1; } } } /** * Return a hashmap with one row's Title, Url, and favicon. * * @param position * Position in the list. * @return Bundle Stores title, url of row position, favicon, and id for the * url. Return a blank map if position is out of range. */ public Bundle getRow(int position, boolean includeCreateTime) { Bundle map = new Bundle(); if (position < 0 || position >= mCount) { return map; } mCursor.moveToPosition(position); String url = mCursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX); map.putString(Browser.BookmarkColumns.TITLE, mCursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX)); map.putString(Browser.BookmarkColumns.URL, url); byte[] data = mCursor.getBlob(Browser.HISTORY_PROJECTION_FAVICON_INDEX); if (data != null) { map.putByteArray("FAV_BYTES", data); map.putParcelable(Browser.BookmarkColumns.FAVICON, BitmapFactory.decodeByteArray(data, 0, data.length)); } if (includeCreateTime && createdColumnIndex != -1) { Long createTime = mCursor.getLong(createdColumnIndex); if (createTime != null && createTime != 0) { map.putLong(Browser.BookmarkColumns.CREATED, createTime); } } map.putInt("id", mCursor.getInt(Browser.HISTORY_PROJECTION_ID_INDEX)); return map; } /** * Update a row in the database with new information. Requeries the database * if the information has changed. * * @param map * Bundle storing id, title and url of new information */ public void updateRow(Bundle map, boolean includeCreateTime) { // Find the record int id = map.getInt("id"); int position = -1; for (mCursor.moveToFirst(); !mCursor.isAfterLast(); mCursor .moveToNext()) { if (mCursor.getInt(Browser.HISTORY_PROJECTION_ID_INDEX) == id) { position = mCursor.getPosition(); break; } } if (position < 0) { return; } mCursor.moveToPosition(position); ContentValues values = new ContentValues(); String title = map.getString(Browser.BookmarkColumns.TITLE); if (!title.equals(mCursor .getString(Browser.HISTORY_PROJECTION_TITLE_INDEX))) { values.put(Browser.BookmarkColumns.TITLE, title); } String url = map.getString(Browser.BookmarkColumns.URL); if (!url.equals(mCursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX))) { values.put(Browser.BookmarkColumns.URL, url); } byte[] favicon = map.getByteArray("FAV_BYTES"); if (favicon != null) { values.put(Browser.BookmarkColumns.FAVICON, favicon); } if (includeCreateTime) { Long createTime = map.getLong(Browser.BookmarkColumns.CREATED); if (createTime != null) values.put(Browser.BookmarkColumns.CREATED, createTime); } if (values.size() > 0 && mContentResolver.update(Browser.BOOKMARKS_URI, values, "_id = " + id, null) != -1) { refreshList(); } } /** * Delete a row from the database. Requeries the database. Does nothing if * the provided position is out of range. * * @param position * Position in the list. */ public void deleteRow(int position) { if (position < 0 || position >= getCount()) { return; } mCursor.moveToPosition(position); String url = mCursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX); WebIconDatabase.getInstance().releaseIconForPageUrl(url); Uri uri = ContentUris.withAppendedId(Browser.BOOKMARKS_URI, mCursor.getInt(Browser.HISTORY_PROJECTION_ID_INDEX)); int numVisits = mCursor.getInt(Browser.HISTORY_PROJECTION_VISITS_INDEX); if (0 == numVisits) { mContentResolver.delete(uri, null, null); } else { // It is no longer a bookmark, but it is still a visited site. ContentValues values = new ContentValues(); values.put(Browser.BookmarkColumns.BOOKMARK, 0); mContentResolver.update(uri, values, null, null); } refreshList(); } /** * Refresh list to recognize a change in the database. */ public void refreshList() { searchInternal(); } /** * Search the database for bookmarks that match the input string. * * @param like * String to use to search the database. Strings with spaces are * treated as having multiple search terms using the OR operator. * Search both the title and url. */ public void search() { searchInternal(); } /** * Update the bookmark's favicon. * * @param cr * The ContentResolver to use. * @param url * The url of the bookmark to update. * @param favicon * The favicon bitmap to write to the db. */ /* package */static void updateBookmarkFavicon(ContentResolver cr, String url, Bitmap favicon) { if (url == null || favicon == null) { return; } // Strip the query. int query = url.indexOf('?'); String noQuery = url; if (query != -1) { noQuery = url.substring(0, query); } url = noQuery + '?'; // Use noQuery to search for the base url (i.e. if the url is // http://www.yahoo.com/?rs=1, search for http://www.yahoo.com) // Use url to match the base url with other queries (i.e. if the url is // http://www.google.com/m, search for // http://www.google.com/m?some_query) final String[] selArgs = new String[] { noQuery, url }; final String where = "(" + Browser.BookmarkColumns.URL + " == ? OR " + Browser.BookmarkColumns.URL + " GLOB ? || '*') AND " + Browser.BookmarkColumns.BOOKMARK + " == 1"; final String[] projection = new String[] { Browser.BookmarkColumns._ID }; final Cursor c = cr.query(Browser.BOOKMARKS_URI, projection, where, selArgs, null); boolean succeed = c.moveToFirst(); ContentValues values = null; while (succeed) { if (values == null) { final ByteArrayOutputStream os = new ByteArrayOutputStream(); favicon.compress(Bitmap.CompressFormat.PNG, 100, os); values = new ContentValues(); values.put(Browser.BookmarkColumns.FAVICON, os.toByteArray()); } cr.update( ContentUris.withAppendedId(Browser.BOOKMARKS_URI, c.getInt(0)), values, null, null); succeed = c.moveToNext(); } c.close(); } /** * Internal function used in search, sort, and refreshList. */ private int createdColumnIndex = -1; private void searchInternal() { if (mCursor != null) { mCursor.unregisterContentObserver(mChangeObserver); mCursor.unregisterDataSetObserver(mDataSetObserver); mCursor.deactivate(); } // need to add the created date column to the query String[] columns = new String[Browser.HISTORY_PROJECTION.length + 1]; System.arraycopy(Browser.HISTORY_PROJECTION, 0, columns, 0, Browser.HISTORY_PROJECTION.length); createdColumnIndex = columns.length - 1; columns[createdColumnIndex] = Browser.BookmarkColumns.CREATED; String whereClause = Browser.BookmarkColumns.BOOKMARK + " == 1"; String orderBy = Browser.BookmarkColumns.CREATED + " DESC"; String[] selectionArgs = null; mCursor = mContentResolver.query(Browser.BOOKMARKS_URI, columns, whereClause, selectionArgs, orderBy); mCursor.registerContentObserver(mChangeObserver); mCursor.registerDataSetObserver(mDataSetObserver); mDataValid = true; notifyDataSetChanged(); mCount = mCursor.getCount(); } /** * How many items should be displayed in the list. * * @return Count of items. */ public int getCount() { if (mDataValid) { return mCount; } else { return 0; } } public boolean areAllItemsEnabled() { return true; } public boolean isEnabled(int position) { return true; } /** * Get the data associated with the specified position in the list. * * @param position * Index of the item whose data we want. * @return The data at the specified position. */ public Object getItem(int position) { return null; } /** * Get the row id associated with the specified position in the list. * * @param position * Index of the item whose row id we want. * @return The id of the item at the specified position. */ public long getItemId(int position) { return position; } int mCurrentSelection = -1; public void setSelected(int position) { mCurrentSelection = position; notifyDataSetInvalidated(); } /** * Get a View that displays the data at the specified position in the list. * * @param position * Index of the item whose view we want. * @return A View corresponding to the data at the specified position. */ public View getView(int position, View convertView, ViewGroup parent) { if (!mDataValid) { throw new IllegalStateException( "this should only be called when the cursor is valid"); } if (position < 0 || position > mCount) { throw new AssertionError( "BrowserBookmarksAdapter tried to get a view out of range"); } if (convertView == null) { convertView = new BookmarkItem(mBookmarker); } bind((BookmarkItem) convertView, position); if (position == mCurrentSelection) { ((BookmarkItem) convertView).setSelected(); } else { ((BookmarkItem) convertView).setUnselected(); } return convertView; } /** * Return the title for this item in the list. */ public String getTitle(int position) { return getString(Browser.HISTORY_PROJECTION_TITLE_INDEX, position); } /** * Return the Url for this item in the list. */ public String getUrl(int position) { return getString(Browser.HISTORY_PROJECTION_URL_INDEX, position); } /** * Private helper function to return the title or url. */ private String getString(int cursorIndex, int position) { if (position < 0 || position > mCount) { return ""; } mCursor.moveToPosition(position); return mCursor.getString(cursorIndex); } private void bind(BookmarkItem b, int position) { mCursor.moveToPosition(position); String title = mCursor .getString(Browser.HISTORY_PROJECTION_TITLE_INDEX); b.setName(title); String url = mCursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX); b.setUrl(url); byte[] data = mCursor.getBlob(Browser.HISTORY_PROJECTION_FAVICON_INDEX); if (data != null) { b.setFavicon(BitmapFactory.decodeByteArray(data, 0, data.length)); } else { b.setFavicon(null); } } private class ChangeObserver extends ContentObserver { public ChangeObserver() { super(new Handler()); } @Override public boolean deliverSelfNotifications() { return true; } @Override public void onChange(boolean selfChange) { refreshList(); } } private class MyDataSetObserver extends DataSetObserver { @Override public void onChanged() { mDataValid = true; notifyDataSetChanged(); } @Override public void onInvalidated() { mDataValid = false; notifyDataSetInvalidated(); } } // returns new position public int moveItemUp(int position) { if (position > 0) { Bundle rowOnTop = getRow(position - 1, false); Bundle rowUnder = getRow(position, false); int upId = rowOnTop.getInt("id"); rowOnTop.putInt("id", rowUnder.getInt("id")); rowUnder.putInt("id", upId); mCurrentSelection--; updateRow(rowOnTop, false); updateRow(rowUnder, false); return mCurrentSelection; } else return position; } // returns new position public int moveItemDown(int position) { if (position < mCount - 1) { Bundle rowOnTop = getRow(position, false); Bundle rowUnder = getRow(position + 1, false); int upId = rowOnTop.getInt("id"); rowOnTop.putInt("id", rowUnder.getInt("id")); rowUnder.putInt("id", upId); mCurrentSelection++; updateRow(rowOnTop, false); updateRow(rowUnder, false); return mCurrentSelection; } else return position; } // returns new position public int moveToTop(int position) { if (position > 0) { // get the row Bundle rowToMove = getRow(position, false); // set its created time to now rowToMove.putLong(Browser.BookmarkColumns.CREATED, new Date().getTime()); // update the row updateRow(rowToMove, true); mCurrentSelection = 0; return mCurrentSelection; } else return position; } // returns new post public int moveToBottom(int position) { if (position < mCount - 1) { // get the time the last row in the list was created Bundle lastRow = getRow(mCount - 1, true); Long createTime = lastRow.getLong(Browser.BookmarkColumns.CREATED); long newCreateTime = (createTime == null || createTime == 0) ? 0 : createTime - 1; // set the create time of our row to older than the last on the list Bundle rowToMove = getRow(position, false); rowToMove.putLong(Browser.BookmarkColumns.CREATED, newCreateTime); updateRow(rowToMove, true); mCurrentSelection = mCount - 1; return mCurrentSelection; } else return position; } public String launchUrlOfItem(int position) { try { return getRow(position, false).getString( Browser.BookmarkColumns.URL); } catch (Exception e) { return null; } } }
bookmark_item.xml:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingLeft="10dip" android:paddingTop="5dip" android:paddingBottom="5dip" android:id="@+id/bookmarkitem"> <ImageView android:id="@+id/favicon" android:layout_width="20dip" android:layout_height="20dip" android:focusable="false" android:padding="2dip" android:layout_marginTop="4dip" android:layout_marginRight="6dip" android:layout_alignParentTop="true" android:background="@drawable/fav_icn_background" android:src="@drawable/app_web_browser_sm" android:layout_alignParentLeft="true" /> <TextView android:id="@+id/title" android:textAppearance="?android:attr/textAppearanceMedium" android:maxLines="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/favicon" android:ellipsize="end" /> <TextView android:id="@+id/url" android:textAppearance="?android:attr/textAppearanceSmall" android:maxLines="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/title" android:layout_toRightOf="@+id/favicon" android:ellipsize="end" /> </RelativeLayout>
main.xml:
<?xml version="1.0" encoding="utf-8"?> <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:id="@+id/mylistview" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <ImageView android:id="@+id/imageview" android:layout_width="70px" android:layout_height="427px" android:layout_x="250px" android:layout_y="0px" android:background="#66FFFFFF"> </ImageView> <ImageButton android:id="@+id/topbutton" android:layout_width="64px" android:layout_height="60px" android:src="@drawable/top" android:layout_x="252px" android:layout_y="5px" android:scaleType="fitCenter"></ImageButton> <ImageButton android:id="@+id/upbutton" android:layout_width="64px" android:layout_height="60px" android:src="@drawable/up" android:layout_x="252px" android:layout_y="70px" android:scaleType="fitCenter"></ImageButton> <ImageButton android:id="@+id/downbutton" android:src="@drawable/down" android:layout_width="64px" android:layout_height="60px" android:layout_x="252px" android:layout_y="135px" android:scaleType="fitCenter"></ImageButton> <ImageButton android:id="@+id/bottombutton" android:src="@drawable/bottom" android:layout_width="64px" android:layout_height="60px" android:layout_x="252px" android:layout_y="200px" android:scaleType="fitCenter"></ImageButton> <ImageButton android:id="@+id/launchbutton" android:src="@drawable/launch" android:layout_width="64px" android:layout_height="60px" android:layout_x="252px" android:layout_y="305px" android:scaleType="fitCenter"></ImageButton> <ImageButton android:id="@+id/deletebutton" android:layout_width="64px" android:layout_height="60px" android:src="@drawable/trash" android:textSize="12sp" android:layout_x="252px" android:layout_y="370px"> </ImageButton> </AbsoluteLayout>
strings.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">丸子</string> <string name="welcome">Welcome to Bookmarker.\n\nBookmarker is a very simple app which allows you to reorder and delete the bookmarks used in the G1\'s web browser.\nSimple.</string> <string name="nomarks">\n\nYou don\'t have any bookmarks at the moment, Bookmarker will now close.</string> <string name="menu_about">About</string> </resources>
下面是用到的一些图片:








评论
2 楼
maoxy
2012-05-08
获取书签图标的时候,得到的只是个LOGO,但是浏览器里面显示的图片确实网站的缩略图,这个是怎么弄的?
1 楼
573842281
2012-02-17
博主很是强啊,值得学习!
发表评论
-
带你深入理解 FLUTTER 中的字体“冷”知识
2020-08-10 23:40 688本篇将带你深入理解 Flutter 开发过程中关于字体和文 ... -
Flutter -自定义日历组件
2020-03-01 17:56 1157颜色文件和屏幕适配的文件 可以自己给定 import ... -
Dart高级(一)——泛型与Json To Bean
2020-02-23 19:13 1034从 Flutter 发布到现在, 越来越多人开始尝试使用 Da ... -
flutter loading、Progress进度条
2020-02-21 17:03 1219Flutter Progress 1 条形无固定值进度条 ... -
Flutter使用Https加载图片
2020-02-21 01:39 1073Flutter使用Https加载图片 使用http加载图片出 ... -
flutter shared_preferences 异步变同步
2020-02-21 00:55 876前言 引用 在开发原生iOS或Native应用时,一般有判断上 ... -
Flutter TextField边框颜色
2020-02-19 21:31 973监听要销毁 myController.dispose(); T ... -
flutter Future的正确用法
2020-02-18 21:55 833在flutter中经常会用到异步任务,dart中异步任务异步处 ... -
记一次Flutter简单粗暴处理HTTPS证书检验方法
2020-02-18 14:13 1033最近在做Flutter项目到了遇到一个无解的事情,当使用Ima ... -
flutter 获取屏幕宽度高度 通知栏高度等屏幕信息
2019-07-27 08:39 1396##MediaQuery MediaQuery.of(con ... -
关于flutter RefreshIndicator扩展listview下拉刷新的问题
2019-07-10 19:40 1174当条目过少时listview某些嵌套情况下可能不会滚动(条目 ... -
flutter listview 改变状态的时候一直无限添加
2019-07-10 16:01 829setstate的时候会一直无限的调用listview.bui ... -
Flutter Android端启动白屏问题的解决
2019-07-09 00:51 1567问题描述 Flutter 应用在 Android 端上启动时 ... -
Flutter中SnackBar使用
2019-07-08 23:43 823底部弹出,然后在指定时间后消失。 注意: build(Bui ... -
Flutter 之点击空白区域收起键盘
2019-07-08 18:43 1821点击空白处取消TextField焦点这个需求是非常简单的,在学 ... -
Flutter 弹窗 Dialog ,AlertDialog,IOS风格
2019-07-08 18:04 1421import 'package:flutter/mate ... -
flutter ---TextField 之 输入类型、长度限制
2019-07-08 14:30 2373TextField想要实现输入类型、长度限制需要先引入impo ... -
【flutter 溢出BUG】键盘上显示bottom overflowed by 104 PIXELS
2019-07-08 11:13 1637一开始直接使用Scaffold布局,body:new Colu ... -
解决Flutter项目卡在Initializing gradle...界面的问题
2019-07-07 12:53 934Flutter最近很火,我抽出了一点时间对Flutter进行了 ... -
关于android O 上 NotificationChannel 的一些注意事项
2019-07-04 11:47 972最近在适配android O,遇到个问题,应用中原本有设置界面 ...
相关推荐
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
8c71b76fb2ec10cf50fc6b0308d3dcfc_9545878e2b97a84b2e089ece58da9e82
Android逆向过程学习
内容概要:本文详细介绍了基于西门子S7-200 PLC的糖果包装控制系统的设计与实现。首先阐述了PLC在工业自动化领域的优势及其在糖果包装生产线中的重要性。接着深入探讨了系统的硬件连接方式,包括传感器、执行机构与PLC的具体接口配置。随后展示了关键的编程实现部分,如糖果计数、包装执行、送膜控制、称重判断以及热封温度控制等具体梯形图代码片段。此外,还分享了一些实用的经验技巧,如防止信号抖动、PID参数优化、故障诊断方法等。最后总结了该系统的优势,强调其对提高生产效率和产品质量的重要作用。 适合人群:从事工业自动化控制、PLC编程的技术人员,尤其是对小型PLC系统感兴趣的工程师。 使用场景及目标:适用于糖果制造企业,旨在提升包装生产线的自动化程度,确保高效稳定的生产过程,同时降低维护成本并提高产品一致性。 其他说明:文中不仅提供了详细的理论讲解和技术指导,还结合实际案例进行了经验分享,有助于读者更好地理解和掌握相关知识。
内容概要:本文详细介绍了参与西门子杯比赛中关于三部十层电梯系统的博图V15.1程序设计及其WinCC画面展示的内容。文中不仅展示了电梯系统的基本架构,如抢单逻辑、方向决策、状态机管理等核心算法(采用SCL语言编写),还分享了许多实际调试过程中遇到的问题及解决方案,例如未初始化变量导致的异常行为、状态机遗漏空闲状态、WinCC画面动态显示的挑战以及通信配置中的ASCII码解析错误等问题。此外,作者还特别提到一些创意性的设计,如电梯同时到达同一层时楼层显示器变为闪烁爱心的效果,以及节能模式下电梯自动停靠中间楼层的功能。 适合人群:对PLC编程、工业自动化控制、电梯调度算法感兴趣的工程技术人员,尤其是准备参加类似竞赛的学生和技术爱好者。 使用场景及目标:适用于希望深入了解PLC编程实践、掌握电梯群控系统的设计思路和技术要点的人士。通过学习本文可以更好地理解如何利用PLC进行复杂的机电一体化项目的开发,提高解决实际问题的能力。 其他说明:文章风格幽默诙谐,将严肃的技术话题融入轻松的生活化比喻之中,使得原本枯燥的专业知识变得生动有趣。同时,文中提供的经验教训对于从事相关领域的工作者来说非常宝贵,能够帮助他们少走弯路并激发更多创新思维。
慧荣量产工具合集.zip
内容概要:本文详细介绍了永磁同步电机(PMSM)的FOC(磁场定向控制)和SVPWM(空间矢量脉宽调制)算法的仿真模型。首先解释了FOC的基本原理及其核心的坐标变换(Clark变换和Park变换),并给出了相应的Python代码实现。接下来探讨了SVPWM算法的工作机制,包括扇区判断和占空比计算的方法。此外,文章还讨论了电机的PI双闭环控制结构,即速度环和电流环的设计与实现。文中不仅提供了详细的理论背景,还分享了一些实用的编程技巧和注意事项,帮助读者更好地理解和应用这些算法。 适合人群:电气工程专业学生、从事电机控制系统开发的技术人员以及对永磁同步电机控制感兴趣的科研人员。 使用场景及目标:① 学习和掌握永磁同步电机的FOC控制和SVPWM算法的具体实现;② 提供丰富的代码示例和实践经验,便于快速搭建和调试仿真模型;③ 探讨不同参数设置对电机性能的影响,提高系统的稳定性和效率。 其他说明:文章强调了在实际应用中需要注意的一些细节问题,如坐标变换中的系数选择、SVPWM算法中的扇区判断优化以及PI控制器的参数调整等。同时,鼓励读者通过动手实验来加深对各个模块的理解。
# 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
Android逆向过程学习
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
3dmax插件
# 【spring-ai-autoconfigure-vector-store-qdrant-1.0.0-M7.jar中文文档.zip】 中包含: 中文文档:【spring-ai-autoconfigure-vector-store-qdrant-1.0.0-M7-javadoc-API文档-中文(简体)版.zip】 jar包下载地址:【spring-ai-autoconfigure-vector-store-qdrant-1.0.0-M7.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【spring-ai-autoconfigure-vector-store-qdrant-1.0.0-M7.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【spring-ai-autoconfigure-vector-store-qdrant-1.0.0-M7.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【spring-ai-autoconfigure-vector-store-qdrant-1.0.0-M7-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: spring-ai-autoconfigure-vector-store-qdrant-1.0.0-M7.jar中文文档.zip,java,spring-ai-autoconfigure-vector-store-qdrant-1.0.0-M7.jar,org.springframework.ai,spring-ai-autoconfigure-vector-store-qdrant,1.0.0-M7,org.springframework.ai.vectorstore.qdr
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
内容概要:本文详细介绍了平方根容积卡尔曼滤波(SRCKF)在永磁同步电机(PMSM)控制系统中的应用及其相对于传统CKF的优势。文章首先指出传统CKF在处理协方差矩阵时存在的数值不稳定性和非正定问题,导致系统性能下降。接着,作者通过引入SRCKF,利用Cholesky分解和QR分解来确保协方差矩阵的正定性,从而提高状态估计的精度和稳定性。文中展示了具体的电机模型和状态方程,并提供了详细的代码实现,包括状态预测、容积点生成以及观测更新等关键步骤。此外,文章还分享了实际调试过程中遇到的问题及解决方案,如选择合适的矩阵分解库和处理电机参数敏感性。最终,通过实验数据对比,证明了SRCKF在突加负载情况下的优越表现。 适合人群:从事永磁同步电机控制研究的技术人员、研究生及以上学历的研究者。 使用场景及目标:适用于需要高精度状态估计的永磁同步电机控制系统的设计与优化,特别是在处理非线性问题和提高数值稳定性方面。 其他说明:文章引用了相关领域的权威文献,如Arasaratnam的TAC论文和Zhong的《PMSM无传感器控制综述》,并强调了实际工程实践中代码调试的重要性。
# 【tokenizers-***.jar***文档.zip】 中包含: ***文档:【tokenizers-***-javadoc-API文档-中文(简体)版.zip】 jar包下载地址:【tokenizers-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【tokenizers-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【tokenizers-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【tokenizers-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: tokenizers-***.jar***文档.zip,java,tokenizers-***.jar,ai.djl.huggingface,tokenizers,***,ai.djl.engine.rust,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,djl,huggingface,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【tokenizers-***.jar***文档.zip】,再解压其中的 【tokenizers-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>ai.djl.huggingface</groupId> <artifactId>tokenizers</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'ai.djl.huggingface', name: 'tokenizers', version: '***' Gradle (Short): implementation 'ai.djl.huggingface:tokenizers:***' Gradle (Kotlin): implementation("ai.djl.huggingface:tokenizers:***") ``` # 含有的 Java package(包): ``` ai.djl.engine.rust ai.djl.engine.rust.zoo ai.djl.huggingface.tokenizers ai.djl.huggingface.tokenizers.jni ai.djl.huggingface.translator ai.djl.huggingface.zoo ``` # 含有的 Java class(类): ``` ai.djl.engine.rust.RsEngine ai.djl.engine.rust.RsEngineProvider ai.djl.engine.rust.RsModel ai.djl.engine.rust.RsNDArray ai.djl.engine.rust.RsNDArrayEx ai.djl.engine.rust.RsNDArrayIndexer ai.djl.engine.rust.RsNDManager ai.djl.engine.rust.RsSymbolBlock ai.djl.engine.rust.RustLibrary ai.djl.engine.rust.zoo.RsModelZoo ai.djl.engine.rust.zoo.RsZooProvider ai.djl.huggingface.tokenizers.Encoding ai.djl.huggingface.tokenizers.HuggingFaceTokenizer ai.djl.huggingface.tokenizers.HuggingFaceTokenizer.Builder ai.djl.hu
3
pchook源码纯源码不是dll
# 【spring-ai-azure-store-1.0.0-M7.jar中文-英文对照文档.zip】 中包含: 中文-英文对照文档:【spring-ai-azure-store-1.0.0-M7-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【spring-ai-azure-store-1.0.0-M7.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【spring-ai-azure-store-1.0.0-M7.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【spring-ai-azure-store-1.0.0-M7.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【spring-ai-azure-store-1.0.0-M7-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: spring-ai-azure-store-1.0.0-M7.jar中文-英文对照文档.zip,java,spring-ai-azure-store-1.0.0-M7.jar,org.springframework.ai,spring-ai-azure-store,1.0.0-M7,org.springframework.ai.vectorstore.azure,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,springframework,spring,ai,azure,store,中文-英文对照API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【spring-ai-azure-store-1.0.0-M7.jar中文-英文对照文档.zip】,再解
内容概要:本文档是关于信捷电气XD、XL系列可编程序控制器的用户手册(硬件篇)。手册详细介绍了该系列PLC的硬件特性,包括产品概述、本体规格参数、系统构成、电源及输入输出规格、运行调试与维护、软元件切换等内容。此外,还提供了丰富的附录信息,如特殊软元件地址及功能、指令一览表、PLC功能配置表和常见问题解答。手册强调了安全操作的重要性,列出了多个安全注意事项,确保用户在正确环境下安装和使用设备,避免潜在风险。 适合人群:具备一定电气知识的专业人士,尤其是从事自动化控制系统设计、安装、调试及维护的技术人员。 使用场景及目标:①帮助用户了解XD、XL系列PLC的硬件特性和规格参数;②指导用户正确安装、接线、调试和维护设备;③提供详细的故障排查指南和技术支持信息,确保设备稳定运行;④为用户提供编程和指令使用的参考资料。 其他说明:手册不仅涵盖了硬件方面的内容,还涉及到了一些基础的软件编程概念,但更深入的编程指导请参考相关软件篇手册。用户在使用过程中遇到问题可以通过提供的联系方式获得技术支持。手册中的内容会定期更新,以适应产品改进和技术发展的需求。
# 【spring-ai-bedrock-converse-1.0.0-M7.jar中文文档.zip】 中包含: 中文文档:【spring-ai-bedrock-converse-1.0.0-M7-javadoc-API文档-中文(简体)版.zip】 jar包下载地址:【spring-ai-bedrock-converse-1.0.0-M7.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【spring-ai-bedrock-converse-1.0.0-M7.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【spring-ai-bedrock-converse-1.0.0-M7.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【spring-ai-bedrock-converse-1.0.0-M7-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: spring-ai-bedrock-converse-1.0.0-M7.jar中文文档.zip,java,spring-ai-bedrock-converse-1.0.0-M7.jar,org.springframework.ai,spring-ai-bedrock-converse,1.0.0-M7,org.springframework.ai.bedrock.converse,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,springframework,spring,ai,bedrock,converse,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【spring-ai-bedrock-converse-1