Java GestureBuilder无法保存重命名的手势
我从Eclipse中的Android示例项目导入Java GestureBuilder无法保存重命名的手势,java,android,android-layout,gesture,Java,Android,Android Layout,Gesture,我从Eclipse中的Android示例项目导入GestureBuilder。然而,我不知道为什么我不能重命名一个手势并保存它 当删除功能正常工作时,重命名功能无法保存重命名的手势。手势列表显示一个手势被重命名(新名称在那里),但当我单击“重新加载”按钮时,再次加载手势列表,新名称变回旧名称 你们能解释一下原因或提出解决办法吗?非常感谢 仅供参考,代码如下: public class GestureBuilderActivity extends ListActivity { private st
GestureBuilder
。然而,我不知道为什么我不能重命名一个手势并保存它
当删除
功能正常工作时,重命名
功能无法保存重命名的手势。手势列表显示一个手势被重命名(新名称在那里),但当我单击“重新加载”按钮时,再次加载手势列表,新名称变回旧名称
你们能解释一下原因或提出解决办法吗?非常感谢
仅供参考,代码如下:
public class GestureBuilderActivity extends ListActivity {
private static final int STATUS_SUCCESS = 0;
private static final int STATUS_CANCELLED = 1;
private static final int STATUS_NO_STORAGE = 2;
private static final int STATUS_NOT_LOADED = 3;
private static final int MENU_ID_RENAME = 1;
private static final int MENU_ID_REMOVE = 2;
private static final int DIALOG_RENAME_GESTURE = 1;
private static final int REQUEST_NEW_GESTURE = 1;
// Type: long (id)
private static final String GESTURES_INFO_ID = "gestures.info_id";
private final File mStoreFile = new File(Environment.getExternalStorageDirectory(), "gestures");
private final Comparator<NamedGesture> mSorter = new Comparator() {
public int compare(NamedGesture object1, NamedGesture object2) {
return object1.name.compareTo(object2.name);
}
};
private static GestureLibrary sStore;
private GesturesAdapter mAdapter;
private GesturesLoadTask mTask;
private TextView mEmpty;
private Dialog mRenameDialog;
private EditText mInput;
private NamedGesture mCurrentRenameGesture;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gestures_list);
mAdapter = new GesturesAdapter(this);
setListAdapter(mAdapter);
if (sStore == null) {
sStore = GestureLibraries.fromFile(mStoreFile);
}
mEmpty = (TextView) findViewById(android.R.id.empty);
loadGestures();
registerForContextMenu(getListView());
}
static GestureLibrary getStore() {
return sStore;
}
@SuppressWarnings({"UnusedDeclaration"})
public void reloadGestures(View v) {
loadGestures();
}
@SuppressWarnings({"UnusedDeclaration"})
public void addGesture(View v) {
Intent intent = new Intent(this, CreateGestureActivity.class);
startActivityForResult(intent, REQUEST_NEW_GESTURE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case REQUEST_NEW_GESTURE:
loadGestures();
break;
}
}
}
private void loadGestures() {
if (mTask != null && mTask.getStatus() != GesturesLoadTask.Status.FINISHED) {
mTask.cancel(true);
}
mTask = (GesturesLoadTask) new GesturesLoadTask().execute();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mTask != null && mTask.getStatus() != GesturesLoadTask.Status.FINISHED) {
mTask.cancel(true);
mTask = null;
}
cleanupRenameDialog();
}
private void checkForEmpty() {
if (mAdapter.getCount() == 0) {
mEmpty.setText(R.string.gestures_empty);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mCurrentRenameGesture != null) {
outState.putLong(GESTURES_INFO_ID, mCurrentRenameGesture.gesture.getID());
}
}
@Override
protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
long id = state.getLong(GESTURES_INFO_ID, -1);
if (id != -1) {
final Set<String> entries = sStore.getGestureEntries();
out: for (String name : entries) {
for (Gesture gesture : sStore.getGestures(name)) {
if (gesture.getID() == id) {
mCurrentRenameGesture = new NamedGesture();
mCurrentRenameGesture.name = name;
mCurrentRenameGesture.gesture = gesture;
break out;
}
}
}
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
menu.setHeaderTitle(((TextView) info.targetView).getText());
menu.add(0, MENU_ID_RENAME, 0, R.string.gestures_rename);
menu.add(0, MENU_ID_REMOVE, 0, R.string.gestures_delete);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
final AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo)
item.getMenuInfo();
final NamedGesture gesture = (NamedGesture) menuInfo.targetView.getTag();
switch (item.getItemId()) {
case MENU_ID_RENAME:
renameGesture(gesture);
return true;
case MENU_ID_REMOVE:
deleteGesture(gesture);
return true;
}
return super.onContextItemSelected(item);
}
private void renameGesture(NamedGesture gesture) {
mCurrentRenameGesture = gesture;
showDialog(DIALOG_RENAME_GESTURE);
}
@Override
protected Dialog onCreateDialog(int id) {
if (id == DIALOG_RENAME_GESTURE) {
return createRenameDialog();
}
return super.onCreateDialog(id);
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
if (id == DIALOG_RENAME_GESTURE) {
mInput.setText(mCurrentRenameGesture.name);
}
}
private Dialog createRenameDialog() {
final View layout = View.inflate(this, R.layout.dialog_rename, null);
mInput = (EditText) layout.findViewById(R.id.name);
((TextView) layout.findViewById(R.id.label)).setText(R.string.gestures_rename_label);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(0);
builder.setTitle(getString(R.string.gestures_rename_title));
builder.setCancelable(true);
builder.setOnCancelListener(new Dialog.OnCancelListener() {
public void onCancel(DialogInterface dialog) {
cleanupRenameDialog();
}
});
builder.setNegativeButton(getString(R.string.cancel_action),
new Dialog.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
cleanupRenameDialog();
}
}
);
builder.setPositiveButton(getString(R.string.rename_action),
new Dialog.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
changeGestureName();
}
}
);
builder.setView(layout);
return builder.create();
}
private void changeGestureName() {
final String name = mInput.getText().toString();
if (!TextUtils.isEmpty(name)) {
final NamedGesture renameGesture = mCurrentRenameGesture;
final GesturesAdapter adapter = mAdapter;
final int count = adapter.getCount();
// Simple linear search, there should not be enough items to warrant
// a more sophisticated search
for (int i = 0; i < count; i++) {
final NamedGesture gesture = adapter.getItem(i);
if (gesture.gesture.getID() == renameGesture.gesture.getID()) {
sStore.removeGesture(gesture.name, gesture.gesture);
gesture.name = mInput.getText().toString();
sStore.addGesture(gesture.name, gesture.gesture);
break;
}
}
adapter.notifyDataSetChanged();
}
mCurrentRenameGesture = null;
}
private void cleanupRenameDialog() {
if (mRenameDialog != null) {
mRenameDialog.dismiss();
mRenameDialog = null;
}
mCurrentRenameGesture = null;
}
private void deleteGesture(NamedGesture gesture) {
sStore.removeGesture(gesture.name, gesture.gesture);
sStore.save();
final GesturesAdapter adapter = mAdapter;
adapter.setNotifyOnChange(false);
adapter.remove(gesture);
adapter.sort(mSorter);
checkForEmpty();
adapter.notifyDataSetChanged();
Toast.makeText(this, R.string.gestures_delete_success, Toast.LENGTH_SHORT).show();
}
private class GesturesLoadTask extends AsyncTask<Void, NamedGesture, Integer> {
private int mThumbnailSize;
private int mThumbnailInset;
private int mPathColor;
@Override
protected void onPreExecute() {
super.onPreExecute();
final Resources resources = getResources();
mPathColor = resources.getColor(R.color.gesture_color);
mThumbnailInset = (int) resources.getDimension(R.dimen.gesture_thumbnail_inset);
mThumbnailSize = (int) resources.getDimension(R.dimen.gesture_thumbnail_size);
findViewById(R.id.addButton).setEnabled(false);
findViewById(R.id.reloadButton).setEnabled(false);
mAdapter.setNotifyOnChange(false);
mAdapter.clear();
}
@Override
protected Integer doInBackground(Void... params) {
if (isCancelled()) return STATUS_CANCELLED;
if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
return STATUS_NO_STORAGE;
}
final GestureLibrary store = sStore;
if (store.load()) {
for (String name : store.getGestureEntries()) {
if (isCancelled()) break;
for (Gesture gesture : store.getGestures(name)) {
final Bitmap bitmap = gesture.toBitmap(mThumbnailSize, mThumbnailSize,
mThumbnailInset, mPathColor);
final NamedGesture namedGesture = new NamedGesture();
namedGesture.gesture = gesture;
namedGesture.name = name;
mAdapter.addBitmap(namedGesture.gesture.getID(), bitmap);
publishProgress(namedGesture);
}
}
return STATUS_SUCCESS;
}
return STATUS_NOT_LOADED;
}
@Override
protected void onProgressUpdate(NamedGesture... values) {
super.onProgressUpdate(values);
final GesturesAdapter adapter = mAdapter;
adapter.setNotifyOnChange(false);
for (NamedGesture gesture : values) {
adapter.add(gesture);
}
adapter.sort(mSorter);
adapter.notifyDataSetChanged();
}
@Override
protected void onPostExecute(Integer result) {
super.onPostExecute(result);
if (result == STATUS_NO_STORAGE) {
getListView().setVisibility(View.GONE);
mEmpty.setVisibility(View.VISIBLE);
mEmpty.setText(getString(R.string.gestures_error_loading,
mStoreFile.getAbsolutePath()));
} else {
findViewById(R.id.addButton).setEnabled(true);
findViewById(R.id.reloadButton).setEnabled(true);
checkForEmpty();
}
}
}
static class NamedGesture {
String name;
Gesture gesture;
}
private class GesturesAdapter extends ArrayAdapter<NamedGesture> {
private final LayoutInflater mInflater;
private final Map<Long, Drawable> mThumbnails = Collections.synchronizedMap(
new HashMap<Long, Drawable>());
public GesturesAdapter(Context context) {
super(context, 0);
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
void addBitmap(Long id, Bitmap bitmap) {
mThumbnails.put(id, new BitmapDrawable(bitmap));
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.gestures_item, parent, false);
}
final NamedGesture gesture = getItem(position);
final TextView label = (TextView) convertView;
label.setTag(gesture);
label.setText(gesture.name);
label.setCompoundDrawablesWithIntrinsicBounds(mThumbnails.get(gesture.gesture.getID()),
null, null, null);
return convertView;
}
}
}
公共类GestureBuilderActivity扩展了ListActivity{
私有静态最终整数状态_SUCCESS=0;
私有静态最终整数状态_已取消=1;
专用静态最终int状态\无\存储=2;
私有静态最终整数状态未加载=3;
私有静态最终整数菜单\u ID\u RENAME=1;
私有静态最终整数菜单\u ID\u REMOVE=2;
私有静态最终整型对话框\u重命名\u手势=1;
私有静态最终整数请求\新\手势=1;
//类型:长(id)
私有静态最终字符串手势\u INFO\u ID=“birters.INFO\u ID”;
私有最终文件mStoreFile=新文件(Environment.getExternalStorageDirectory(),“手势”);
私有最终比较器mSorter=新比较器(){
公共int比较(namedgestrue对象1、namedgestrue对象2){
返回object1.name.compareTo(object2.name);
}
};
私有静态手势库;
私人手势动作;
私人手势任务mTask;
私有文本视图内存;
私有对话框mRenameDialog;
私有文本输入;
私人姓名斯特尔·麦科伦特·纳默斯;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.signities\u列表);
mAdapter=新的手势dapter(本);
setListAdapter(mAdapter);
if(sStore==null){
sStore=GestureLibraries.fromFile(mStoreFile);
}
mEmpty=(TextView)findViewById(android.R.id.empty);
加载手势();
registerForContextMenu(getListView());
}
静态手势库getStore(){
返回sStore;
}
@SuppressWarnings({“UnusedDeclaration”})
公共无效重新加载手势(视图v){
加载手势();
}
@SuppressWarnings({“UnusedDeclaration”})
公共空间(视图五){
Intent Intent=新的Intent(这个,CreateGestureActivity.class);
startActivityForResult(意图、请求、新姿态);
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
if(resultCode==RESULT\u OK){
开关(请求代码){
案例请求\u新建\u手势:
加载手势();
打破
}
}
}
私有void loadsignities(){
if(mTask!=null&&mTask.getStatus()!=GesturesLoadTask.Status.FINISHED){
mTask.cancel(true);
}
mTask=(GesturesLoadTask)新建GesturesLoadTask().execute();
}
@凌驾
受保护的空onDestroy(){
super.ondestory();
if(mTask!=null&&mTask.getStatus()!=GesturesLoadTask.Status.FINISHED){
mTask.cancel(true);
mTask=null;
}
cleanupRenameDialog();
}
私人作废支票{
if(mAdapter.getCount()==0){
mEmpty.setText(R.string.signatures_empty);
}
}
@凌驾
SaveInstanceState上受保护的无效(束超出状态){
super.onSaveInstanceState(超出状态);
if(mcurrenternamespirate!=null){
putLong(手势信息ID,mcurrenternamespirate.pirate.getID());
}
}
@凌驾
受保护的无效onRestoreInstanceState(捆绑状态){
super.onRestoreInstanceState(状态);
long id=state.getLong(手势信息id,-1);
如果(id!=-1){
最终设置条目=sStore.getGestureEntries();
out:for(字符串名称:条目){
for(手势:sStore.get手势(名称)){
if(手势.getID()==id){
mcurrenternamespirate=new NamedGesture();
mcurrenternamespirate.name=名称;
mcurrenternamespirate.pirate=手势;
爆发
}
}
}
}
}
@凌驾
public void onCreateContextMenu(ContextMenu,视图v,
ContextMenu.ContextMenuInfo menuInfo){
super.onCreateContextMenu(menu,v,menuInfo);
AdapterView.AdapterContextMenuInfo信息=(AdapterView.AdapterContextMenuInfo)菜单信息;
menu.setHeaderTitle(((TextView)info.targetView.getText());
menu.add(0,menu\u ID\u RENAME,0,R.string.signatures\u RENAME);
menu.add(0,menu\u ID\u REMOVE,0,R.string.signatures\u delete);
}
@凌驾
公共布尔值onContextItemSelected(MenuItem项){
最终AdapterView.AdapterContextMenuInfo menuInfo=(AdapterView.AdapterContextMenuInfo)
item.getMenuInfo();
final-namedgestre-signature=(namedgestre)menuInfo.targetView.getTag();
开关(item.getItemId()){
案例菜单\u ID\u重命名:
手势;
返回true;
案例菜单\u ID\u删除:
删除手势(手势);
返回true;
}
返回super.onContextItemSelected(项目);
}
私有无效重命名样式(名称样式){
mcurrenternamespirture=手势;
showDialog(对话框重命名手势);
}
@凌驾
受保护的对话框onCreateDialog(int id){
如果(id==对话框\重命名\手势){
返回createRenameDialog();
}
返回super.onCreateDialog(id);
}
@凌驾
受保护的void onPrepareDialog(int id,对话框){
super.onPrepareDialog(id,对话框);
如果(id==对话框\重命名\手势){
mInput.setText(mcurrenternamespirate.name);
}
}
私有对话框createRenameDialog(){
最终视图布局=视图。充气(此,R.layout.dialog\u重命名,空);
mInput=(EditText)layout.findViewById(R.id.name);
((TextView)layout.findviewbyd(R.id.label)).setText(R.string.signatures\u rename\u label);
AlertDialog.Builder
private void changeGestureName() {
final String name = mInput.getText().toString();
if (!TextUtils.isEmpty(name)) {
final NamedGesture renameGesture = mCurrentRenameGesture;
final GesturesAdapter adapter = mAdapter;
final int count = adapter.getCount();
// Simple linear search, there should not be enough items to warrant
// a more sophisticated search
for (int i = 0; i < count; i++) {
final NamedGesture gesture = adapter.getItem(i);
if (gesture.gesture.getID() == renameGesture.gesture.getID()) {
sStore.removeGesture(gesture.name, gesture.gesture);
gesture.name = mInput.getText().toString();
sStore.addGesture(gesture.name, gesture.gesture);
sStore.save();//Add this to save your rename Gesture. This will solve your Rename Gesture Problem.
break;
}
}
adapter.notifyDataSetChanged();
}
mCurrentRenameGesture = null; }