Java 带有删除操作的工具栏错误

Java 带有删除操作的工具栏错误,java,android,button,action,Java,Android,Button,Action,我按note cardview时出现此错误。 删除操作应该在工具栏上,而不是在上面。 你能帮助我吗? 由于我无法在此处发布活动,因此我发布了url: 很抱歉 如果你需要更多的信息,尽管问。谢谢你的帮助 public class MainActivity extends RoboActionBarActivity implements NavigationView.OnNavigationItemSelectedListener { private static final int

我按note cardview时出现此错误。 删除操作应该在工具栏上,而不是在上面。 你能帮助我吗? 由于我无法在此处发布活动,因此我发布了url: 很抱歉 如果你需要更多的信息,尽管问。谢谢你的帮助

public class MainActivity extends RoboActionBarActivity
    implements NavigationView.OnNavigationItemSelectedListener
    {
private static final int NEW_NOTE_RESULT_CODE = 4;
private static final int EDIT_NOTE_RESULT_CODE = 5;
@InjectView(android.R.id.empty)   private TextView emptyListTextView;
@InjectView(android.R.id.list)    private ListView listView;
@InjectView(R.id.fab) private FloatingActionButton addNoteButton;

@Inject private NoteDAO noteDAO;

private ArrayList<Integer> selectedPositions;
private ArrayList<NotesAdapter.NoteViewWrapper> notesData;
private NotesAdapter listAdapter;
private ActionMode.Callback actionModeCallback;
private ActionMode actionMode;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar); //       getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //Snackbar.make(view, "Nota in salvataggio...", Snackbar.LENGTH_LONG)
              //      .setAction("Action", null).show();

                // Crear una nota nueva
                startActivityForResult(EditNoteActivity.buildIntent(MainActivity.this), NEW_NOTE_RESULT_CODE);
        }

    });
    selectedPositions = new ArrayList<>();
    setupNotesAdapter();
    setupActionModeCallback();
    setListOnItemClickListenersWhenNoActionMode();
    updateView();

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
           this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

    SharedPreferences settings = getSharedPreferences("prefs", 0);
    boolean firstRun = settings.getBoolean("firstRun", true);
     if ( firstRun )
    {  // here run your first-time instructions, for example :
        Intent intent = new Intent(this, MyIntro.class);
        startActivity(intent);
        SharedPreferences.Editor editor = settings.edit();
        editor.putBoolean("firstRun", false);
        editor.commit();
    }

}   @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        case R.id.action_settings:
            startActivity(new Intent("android.intent.action.SettingsActivity"));
            return true;

        case R.id.action_donate:
            Snackbar.make(this.findViewById(android.R.id.content), "Questo contenuto non è ancora disponibile", Snackbar.LENGTH_LONG).setAction("Action", null).show();
            //startActivity(new Intent("android.intent.action.DonateActivity"));
            return true;

        default:
            return super.onOptionsItemSelected(item);

    }


}@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}



@SuppressWarnings("StatementWithEmptyBody")

public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    if (id == R.id.nav_camara) {
        // Handle the camera action
    } else if (id == R.id.nav_gallery) {

    } else if (id == R.id.nav_slideshow) {

    } else if (id == R.id.nav_manage) {

    } else if (id == R.id.nav_share) {
        Intent i2 = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=notes.service.com.servicenotes"));
        startActivity(i2);

    } else if (id == R.id.action_bug){
        Intent intent = new Intent(this, Gitty.class);
        startActivity(intent);
        return true;

    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == NEW_NOTE_RESULT_CODE) {
        if (resultCode == RESULT_OK) addNote(data);
    }
    if (requestCode == EDIT_NOTE_RESULT_CODE) {
        if (resultCode == RESULT_OK) updateNote(data);
    }

    super.onActivityResult(requestCode, resultCode, data);
}

/** Crea la llamada al modo contextual. */
private void setupActionModeCallback() {
    actionModeCallback = new ActionMode.Callback() {

        /** {@inheritDoc} */
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            setListOnItemClickListenersWhenActionMode();
            // inflar menu contextual
            mode.getMenuInflater().inflate(R.menu.context_note, menu);
            return true;
        }

        /** {@inheritDoc} */
        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            // Nada
            return false;
        }

        /** {@inheritDoc} */
        @Override
        public boolean onActionItemClicked(final ActionMode mode, MenuItem item) {
            switch (item.getItemId()) {
                // borrar notas solo si hay notas a borrar; sino se acaba el modo contextual.
                case R.id.action_delete:
                    if (!selectedPositions.isEmpty()) {
                        new AlertDialog.Builder(MainActivity.this)
                                .setMessage(getString(R.string.delete_notes_alert, selectedPositions.size()))
                                .setNegativeButton(android.R.string.no, null)
                                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        deleteNotes(selectedPositions);
                                        mode.finish();
                                    }
                                })
                                .show();
                    } else mode.finish();
                    return true;
                default:
                    return false;
            }
        }

        /** {@inheritDoc} */
        @Override
        public void onDestroyActionMode(ActionMode mode) {
            // Regresar al modo normal
            setListOnItemClickListenersWhenNoActionMode();
            resetSelectedListItems();
        }
    };
}

/** Inicializa el adaptador de notas. */
private void setupNotesAdapter() {
    notesData = new ArrayList<>();
    for (Note note : noteDAO.fetchAll()) {
        NotesAdapter.NoteViewWrapper noteViewWrapper = new NotesAdapter.NoteViewWrapper(note);
        notesData.add(noteViewWrapper);
    }
    listAdapter = new NotesAdapter(notesData);
    listView.setAdapter(listAdapter);
}

/** Actualiza la vista de esta actividad cuando hay notas o no hay notas. */
private void updateView() {
    if (notesData.isEmpty()) { // Mostrar mensaje
        listView.setVisibility(View.GONE);
        emptyListTextView.setVisibility(View.VISIBLE);
    } else { // Mostrar lista
        listView.setVisibility(View.VISIBLE);
        emptyListTextView.setVisibility(View.GONE);
    }
}

/**
 * Agrega una nota a lista y la fuente de datos.
 *
 * @param data los datos de la actividad de edición de notas.
 */
private void addNote(Intent data) {
    Note note = EditNoteActivity.getExtraNote(data);
    noteDAO.insert(note);
    NotesAdapter.NoteViewWrapper noteViewWrapper = new NotesAdapter.NoteViewWrapper(note);
    notesData.add(noteViewWrapper);
    updateView();
    listAdapter.notifyDataSetChanged();
}
/**
 * Borra notas de la lista y de la fuente de datos.
 *
 * @param selectedPositions las posiciones de las notas en la lista.
 */
private void deleteNotes(ArrayList<Integer> selectedPositions) {
    ArrayList<NotesAdapter.NoteViewWrapper> toRemoveList = new ArrayList<>(selectedPositions.size());
    // Primero borra de la base de datos
    for (int position : selectedPositions) {
        NotesAdapter.NoteViewWrapper noteViewWrapper = notesData.get(position);
        toRemoveList.add(noteViewWrapper);
        noteDAO.delete(noteViewWrapper.getNote());
    }
    // Y luego de la vista (no al mismo tiempo porque pierdo las posiciones que hay que borrar)
    for (NotesAdapter.NoteViewWrapper noteToRemove : toRemoveList) notesData.remove(noteToRemove);
    updateView();
    listAdapter.notifyDataSetChanged();
}

/**
 * Actualiza una nota en la lista y la fuente de datos.
 *
 * @param data los datos de la actividad de edición de notas.
 */
private void updateNote(Intent data) {
    Note updatedNote = ViewNoteActivity.getExtraUpdatedNote(data);
    noteDAO.update(updatedNote);
    for (NotesAdapter.NoteViewWrapper noteViewWrapper : notesData) {
        // Buscar la nota vieja para actulizarla en la vista
        if (noteViewWrapper.getNote().getId().equals(updatedNote.getId())) {
            noteViewWrapper.getNote().setTitle(updatedNote.getTitle());
            noteViewWrapper.getNote().setContent(updatedNote.getContent());
            noteViewWrapper.getNote().setUpdatedAt(updatedNote.getUpdatedAt());
        }
    }
    listAdapter.notifyDataSetChanged();
}

/** Reinicia las notas seleccionadas a no seleccionadas y limpia la lista de seleccionados. */
private void resetSelectedListItems() {
    for (NotesAdapter.NoteViewWrapper noteViewWrapper : notesData) noteViewWrapper.setSelected(false);
    selectedPositions.clear();
    listAdapter.notifyDataSetChanged();
}

/**
 * Inicializa las acciones de la lista al hacer click en sus items cuando NO esta activo el
 * modo contextual.
 */
private void setListOnItemClickListenersWhenNoActionMode() {
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            // Ver la nota al hacer click
            startActivityForResult(ViewNoteActivity.buildIntent(MainActivity.this, notesData.get(position).getNote()), EDIT_NOTE_RESULT_CODE);
        }
    });
    listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            // Iniciar modo contextual para selección de items
            notesData.get(position).setSelected(true);
            listAdapter.notifyDataSetChanged();
            selectedPositions.add(position);
            actionMode = startSupportActionMode(actionModeCallback);
            actionMode.setTitle(String.valueOf(selectedPositions.size()));
            return true;
        }
    });
}

/**
 * Inicializa las acciones de la lista al hacer click en sus items cuando esta activo el menu
 * contextual.
 */
private void setListOnItemClickListenersWhenActionMode() {
    listView.setOnItemLongClickListener(null);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            // Agregar items a la lista de seleccionados y cambiarles el fondo.
            // Si se deseleccionan todos los items, se acaba el modo contextual
            if (selectedPositions.contains(position)) {
                selectedPositions.remove((Object) position); // no quiero el índice sino el objeto
                if (selectedPositions.isEmpty()) actionMode.finish();
                else {
                    actionMode.setTitle(String.valueOf(selectedPositions.size()));
                    notesData.get(position).setSelected(false);
                    listAdapter.notifyDataSetChanged();
                }
            } else {
                notesData.get(position).setSelected(true);
                listAdapter.notifyDataSetChanged();
                selectedPositions.add(position);
                actionMode.setTitle(String.valueOf(selectedPositions.size()));
            }
        }
    });
}

}

假设您的主题与以下内容相似:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>
toolbar.inflateMenu(R.menu.main);
在创建工具栏之后


让我知道这是否有效。

在清单中,您将声明要使用MyAppTheme作为样式

<application
        ..
        android:theme="@style/MyAppTheme"
        ..>
请注意,您需要删除清单中.MainActivity的类似行。当前您关闭了标记,并且清单结构不干净

现在最重要的是:在样式中定义新样式,如下所示:

<style name="MyAppTheme" parent="Theme.AppCompat.Light.NoActionBar">

        <item name="windowActionModeOverlay">true</item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>

</style>
这将是一个解决方案,它将确保ActionMode项不会被按下工具栏

没有什么比这更重要的了:

本地化所有字符串不要硬编码一半是英语,一半是意大利语 您的新好友是Win上的ctrl+alt+L或mac上的cmd+alt+L。这个shortcut将自动格式化类和XML中的代码,因为目前项目中的代码很难阅读,因为没有对齐,而且看起来很凌乱 考虑使用DARG2或更简单,但不太强大的奶油刀,而不是机器人汁。如果你没有像看起来那样从别人那里接受这个项目,你就会知道我在说什么 您不应该硬编码api键并在github上发布它们。这是不安全的,任何人看到这些都可以对你的帐户做任何事情。我应该大胆一点。 若你们不想通过代码免费提供应用程序,那个么你们不应该将apk提交给回购,这看起来好像你们并没有计划,但apk已经提交了 一般来说,你需要组织更好的Android Studio项目,并注意你的承诺。现在回购协议中有很多混乱 不要盲目地使用别人不懂的代码。
为什么你不能在这里发布你的代码?还有logcat输出。第一次网站给我一个错误,现在我把它,我希望ti是正确的。为什么是logcat?你说你按下按钮时会出错。logcat Out将说明错误是什么以及它来自哪一行代码。错误是工具栏上没有显示,但我想是在actionbar上,我不知道为什么。logcatOk中不是显示了错误吗?当您使用调试器单步执行代码时,您发现了什么?顶部的操作栏消失了吗?没有代码很难帮助您。你的项目是开源的吗?如果我能运行代码,找出我这边的答案,那就容易多了……你能把它上传到github吗?好的,我会尽快完成。谢谢你花了这么多时间。给你,我希望这有助于感谢一切,错误出现在清单中,因为我将一个主题分配给了一个活动,而不是应用程序
<style name="MyAppTheme" parent="Theme.AppCompat.Light.NoActionBar">

        <item name="windowActionModeOverlay">true</item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>

</style>