Java GestureBuilder无法保存重命名的手势

Java GestureBuilder无法保存重命名的手势,java,android,android-layout,gesture,Java,Android,Android Layout,Gesture,我从Eclipse中的Android示例项目导入GestureBuilder。然而,我不知道为什么我不能重命名一个手势并保存它 当删除功能正常工作时,重命名功能无法保存重命名的手势。手势列表显示一个手势被重命名(新名称在那里),但当我单击“重新加载”按钮时,再次加载手势列表,新名称变回旧名称 你们能解释一下原因或提出解决办法吗?非常感谢 仅供参考,代码如下: public class GestureBuilderActivity extends ListActivity { private st

我从Eclipse中的Android示例项目导入
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; }