Wie zu stoppen toast & alertDialog verlieren Fokus auf meinem EditText Filter

AKTUALISIEREN:

Neueste update – getChanges () – Methode wurde hinzugefügt.

  • Die Aktivität hat das Fenster com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0 ausgelaufen, das ursprünglich hier hinzugefügt wurde
  • Erstellen Sie benutzerdefinierte Benachrichtigung, Android
  • Ändern des Animationsstils von ViewPager
  • Verwenden Sie die Symbolleiste über alle Aktivitäten (Android)
  • Mp4parser läuft auf Gerät von Android Studio, stürzt aber ab, wenn man die APK manuell installiert
  • android - richten Sie eine Textansicht auf die Mitte einer anderen Ansicht aus
  • Zweites Update – ich habe die ganze meiner ShoppingList.java Klasse hinzugefügt.

    Erstes Update – Nach 2 Personen, die die Frage mögen, aber keine Antworten, habe ich für diese Frage eine Prämie eröffnet.

    Frage:

    Ich habe ähnliche Probleme hierauf gehabt, wo ich nicht in der Lage bin, meine ListView neu zu filtern, sobald ich eine neue Absicht beginne und dann wieder zur ursprünglichen Seite zurückkehren werde. Dies wurde mit der Verwendung einer Überlagerung der onResume () – Methode und dem Abrufen meines Filtercodes aus einer anderen Filtermethode gelöst.

    Die letzte Ausgabe, die ich habe, sollte ein dialogBuilder oder eine Toast-Nachricht auf meiner App-Seite verwendet werden, dann wird wieder der Filtertext gelöscht, dh jeder Text, der in meinen Filter eingegeben wird, wird EditText von meinem Filter ignoriert.

    Hier sind einige Screenshots, um das Problem hervorzuheben:

    Loaded ListView der Elemente:

    Bildbeschreibung hier eingeben

    Ein Suchbegriff wird in den Filter EditText eingegeben und korrekt eingefiltert:

    Bildbeschreibung hier eingeben

    Der erste Punkt 'A' wird auf 'AB' bearbeitet. Die Toastnachricht bestätigt die Aktion:

    Bildbeschreibung hier eingeben

    Dies ist das Problem, der dialogbuilder (was ist, wie das Element bearbeitet wird) und Toast-Nachricht abgeschlossen sind, wird ein neuer Filter-Term in den EditText eingegeben und der Filter filtert nicht mehr:

    Bildbeschreibung hier eingeben

    Hier ist mein Filtercode:

    package com.example.flybaseapp; public class ShoppingList extends ListActivity implements OnClickListener { Button AddItem; Button showShop; ListView showItems; SimpleCursorAdapter cursorAdapter; Long itemId; TextView totalPrice; String itemDescription; int itemAmount; int itemPrice; EditText itemNameEdit; DBHandlerShop getCons; Dialog e1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.shoppinglistlayout); AddItem = (Button) findViewById(R.id.btnAddItem); showShop = (Button) findViewById(R.id.btnSearchShops); showItems = (ListView) findViewById(android.R.id.list); totalPrice = (TextView) findViewById(R.id.totalListPrice); AddItem.setOnClickListener(this); showShop.setOnClickListener(this); setList(); int setPrice = updateTotal(); totalPrice.setText(Integer.toString(setPrice)); itemNameEdit = (EditText) findViewById(R.id.inputItemName); showItems.setTextFilterEnabled(true); itemNameEdit.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { cursorAdapter.getFilter().filter(s.toString()); showItems.refreshDrawableState(); } }); getCons = new DBHandlerShop(this, null, null); getCons.open(); cursorAdapter.setFilterQueryProvider(new FilterQueryProvider() { public Cursor runQuery(CharSequence constraint) { return getCons.getChanges((constraint.toString())); } }); showItems.setAdapter(cursorAdapter); } @Override public void onClick(View clickedAdd) { switch (clickedAdd.getId()) { case (R.id.btnAddItem): show(); break; case (R.id.btnSearchShops): Intent checkGPS = new Intent("com.example.flybaseapp.CheckGPS"); startActivity(checkGPS); break; } } @Override protected void onListItemClick(ListView l, View v, int position, long idd) { super.onListItemClick(l, v, position, idd); itemId = idd; final CharSequence[] items = { "Edit Item", "Delete Item" }; Builder alertDialogBuilder = new AlertDialog.Builder(ShoppingList.this); alertDialogBuilder.setTitle("Item Options:"); alertDialogBuilder.setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { if (items[item].equals("Edit Item")) { AlertDialog.Builder builder = new AlertDialog.Builder( ShoppingList.this); builder.setTitle("Edit Item"); DBHandlerShop setEdit = new DBHandlerShop( ShoppingList.this, null, null); setEdit.open(); String itemName = setEdit.getItem(itemId); int itemAmount = setEdit.getItemQuan(itemId); int itemPrice = setEdit.getItemCost(itemId); setEdit.close(); LinearLayout layout = new LinearLayout( ShoppingList.this); layout.setOrientation(LinearLayout.VERTICAL); final EditText titleBox = new EditText( ShoppingList.this); titleBox.setText(itemName); titleBox.setHint("Item Name:"); layout.addView(titleBox); final EditText quantityBox = new EditText( ShoppingList.this); quantityBox.setText(Integer.toString(itemAmount)); quantityBox.setHint("Item Quantity"); layout.addView(quantityBox); final EditText priceBox = new EditText( ShoppingList.this); priceBox.setText(Integer.toString(itemPrice)); priceBox.setHint("Item Price."); layout.addView(priceBox); builder.setView(layout); builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick( DialogInterface dialog, int whichButton) { Editable valueItem = titleBox .getText(); Editable valueAmount = quantityBox .getText(); Editable valuePrice = priceBox .getText(); String itemDescription = valueItem .toString(); String s = valueAmount.toString(); int itemAmount = Integer .parseInt(s); String a = valuePrice.toString(); int itemPrice = Integer.parseInt(a); try { DBHandlerShop update = new DBHandlerShop( ShoppingList.this, null, null); int totalCombined = itemAmount * itemPrice; update.open(); update.updateItem(itemId, itemDescription, itemAmount, itemPrice); update.close(); int setPrice = updateTotal(); totalPrice.setText(Integer .toString(setPrice)); } catch (Exception e) { Toast.makeText( getApplicationContext(), "Items not updated.", Toast.LENGTH_SHORT) .show(); } finally { Toast.makeText( getApplicationContext(), "Items updated.", Toast.LENGTH_SHORT) .show(); setList(); } } }); builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick( DialogInterface dialog, int whichButton) { } }); builder.show(); } else if (items[item].equals("Delete Item")) { try { DBHandlerShop delete = new DBHandlerShop( ShoppingList.this, null, null); delete.open(); delete.deleteItem(itemId); delete.close(); DBHandlerShop findPrice = new DBHandlerShop( ShoppingList.this, null, null); findPrice.open(); int returnedCost = findPrice .getItemCost(itemId); findPrice.close(); int cost = updateTotal(); int newTotal = cost - returnedCost; totalPrice.setText(Integer.toString(newTotal)); } catch (Exception e) { Toast.makeText(getApplicationContext(), "Item failed to be deleted.", Toast.LENGTH_SHORT).show(); } finally { Toast.makeText(getApplicationContext(), "Item deleted from the list.", Toast.LENGTH_SHORT).show(); setList(); } } } }); alertDialogBuilder.show(); } @SuppressWarnings("deprecation") private void setList() { DBHandlerShop DBShop = new DBHandlerShop(this, null, null); DBHandlerShop searchItems = new DBHandlerShop(this, null, null); searchItems.open(); Cursor cursor = searchItems.getItems(); startManagingCursor(cursor); searchItems.close(); String[] from = new String[] { DBShop.KEY_ITEMSHOP, DBShop.KEY_ITEMNUM, DBShop.KEY_ITEMPRICE }; int[] to = new int[] { R.id.txtSetItem, R.id.txtSetAmount, R.id.txtSetPrice }; cursorAdapter = new SimpleCursorAdapter(this, R.layout.setshoppinglist, cursor, from, to); showItems.setAdapter(cursorAdapter); } private int updateTotal() { DBHandlerShop total = new DBHandlerShop(this, null, null); int totalPrice = 0; total.open(); Cursor totalPrices = total.getTotals(); total.close(); if (totalPrices != null) { startManagingCursor(totalPrices); if (totalPrices.moveToFirst()) { do { int cost = totalPrices.getInt(3); int amount = totalPrices.getInt(2); int totalCost = cost * amount; totalPrice += totalCost; } while (totalPrices.moveToNext()); return totalPrice; } } else { return totalPrice; } return 0; } private void show() { AlertDialog.Builder builder = new AlertDialog.Builder(ShoppingList.this); builder.setTitle("Enter Item Details:"); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); final EditText titleBox = new EditText(this); titleBox.setHint("Item Name:"); layout.addView(titleBox); final EditText quantityBox = new EditText(this); quantityBox.setHint("Item Quantity"); layout.addView(quantityBox); final EditText priceBox = new EditText(this); priceBox.setHint("Item Price."); layout.addView(priceBox); builder.setView(layout); builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { try { Editable valueItem = titleBox.getText(); Editable valueAmount = quantityBox.getText(); Editable valuePrice = priceBox.getText(); itemDescription = valueItem.toString(); String s = valueAmount.toString(); itemAmount = Integer.parseInt(s); String a = valuePrice.toString(); itemPrice = Integer.parseInt(a); DBHandlerShop addItem = new DBHandlerShop( ShoppingList.this, null, null); addItem.open(); addItem.insertItems(itemDescription, itemAmount, itemPrice); addItem.close(); } catch (Exception e) { Toast.makeText(getApplicationContext(), "Item failed to be added", Toast.LENGTH_SHORT) .show(); } finally { Toast.makeText(getApplicationContext(), "Item added to your list", Toast.LENGTH_SHORT) .show(); int cost = updateTotal(); totalPrice.setText(Integer.toString(cost)); setList(); } } }); builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }); builder.show(); } @Override protected void onResume() { super.onResume(); setList(); showItems.setTextFilterEnabled(true); itemNameEdit.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { cursorAdapter.getFilter().filter(s.toString()); showItems.refreshDrawableState(); } }); getCons = new DBHandlerShop(this, null, null); getCons.open(); cursorAdapter.setFilterQueryProvider(new FilterQueryProvider() { public Cursor runQuery(CharSequence constraint) { return getCons.getChanges((constraint.toString())); } }); showItems.setAdapter(cursorAdapter); } } 

    GetChanges () aus der Datenbank-Handler-Klasse:

     public Cursor getChanges(String constraintPassed) { String [] columns = new String[]{KEY_ROWSHOPID, KEY_ITEMSHOP, KEY_ITEMNUM, KEY_ITEMPRICE}; Cursor c = null; if(constraintPassed.equals("")) { c = ourDatabase.query(DATABASE_TABLESHOP, columns, null, null, null, null, null); } else { c = ourDatabase.query(DATABASE_TABLESHOP, columns, KEY_ITEMSHOP + " LIKE'" + constraintPassed + "%'", null, null, null, KEY_ITEMSHOP + " ASC", null); } if( c != null) { c.moveToFirst(); } return c; } 

    Muss ich eine Lebenszyklusmethode implementieren, sobald die Bearbeitung erfolgt ist? Wenn ja, könnte jemand mich in die richtige Richtung drücken, die benötigt wird, wie ich es versucht habe, auf Resume () und onRestart () ohne Erfolg zu haben.

  • App komplett neu starten, wenn durch das Symbol gestartet in Launcher gestartet
  • Ungedeckter Fehler: INVALID_STATE_ERR: DOM Ausnahme 11
  • Android: Samsung Galaxy Tabs und Android 2.2 Geräte GPS-Datum anzeigen 1 Tag vor dem 1. Januar 2012
  • Ermitteln Sie eine neue Android-Benachrichtigung
  • Ist es möglich, den Abstand zum Objekt mit der Kamera zu messen?
  • Android WebView schlägt fehl, den Inhalt bis zur Benutzerinteraktion vollständig zu verteilen
  • 6 Solutions collect form web for “Wie zu stoppen toast & alertDialog verlieren Fokus auf meinem EditText Filter”

    Versuchen Sie, notifyDataSetChanged() auf Ihrem Adapter notifyDataSetChanged() nachdem Sie den Filter aktualisiert haben. Dies sollte dem ListView dass es seine Daten auch ListView muss.

    Soweit ich sehen kann, läuft du getCons.open(); Mehrmals ohne sie zu schließen. Ich weiß nicht, ob diese open() -Methode mehrere Anrufe ignoriert oder es mehrere Male anruft, verursacht einen Fehler, aber vielleicht möchten Sie versuchen, ob Sie es beheben können, indem Sie getCons.open(); Direkt unter getCons = new DBHandlerShop(this, null, null); .

    Ein einfacher Weg um dieses Problem, das ich gefunden habe, ist, einfach die Klasse zu erinnern, indem ich ein neues Absichtsobjekt nach dem Bearbeiten einleitet. Dies macht immer noch den gesamten Betrieb des Prozesses glatt und schnell, und natürlich erlaubt mir, nach einer Bearbeitung zu filtern. Also für die Zeit Jungs das ist, wie ich damit gehen werde.

    Ich sehe, was in deinem Fall passiert ist. Jedes Mal, wenn der Benutzer ein Element erfolgreich bearbeitet, setzen Sie einen neuen Adapter auf Ihre Liste! Und in Ihrem Fall auch der TextWatcher hinzugefügt, um Ihre EditText in der onCreate- Methode ist die Verwendung der ganz ersten Adapter (in der onTextChanged- Methode) auch in der onCreate- Methode erstellt, das erste Mal die Aktivität erstellt wird!

    Es gibt mehrere Möglichkeiten, dieses Problem zu lösen. Ein Weg wäre, den ganzen Weg zu ändern, den du deine Tätigkeit umgesetzt hast (ich persönlich hätte es nicht so gemacht).

    Ein anderer Weg wäre, einfach die setList- Methode zu ändern, die das erste Mal in der onCreate- Methode genannt wird, und jedes Mal, wenn der Benutzer ein Element erfolgreich bearbeitet. Dies ist die Lösung, die ich in Details erklären werde, da es schnell und einfach ist und NICHT Zeit für Sie verbraucht:

    • Wenn die Liste keinen Adapter hat, dann erstellen Sie einen.
    • Wenn die Liste bereits einen Adapter hat, dann einfach den Cursor des Adapters ändern und die Liste aktualisieren.

    Also deine SetList- Methode sollte so aussehen:

     @SuppressWarnings("deprecation") private void setList() { DBHandlerShop DBShop = new DBHandlerShop(this, null, null); DBHandlerShop searchItems = new DBHandlerShop(this, null, null); searchItems.open(); Cursor cursor = searchItems.getItems(); startManagingCursor(cursor); searchItems.close(); String[] from = new String [] { DBShop.KEY_ITEMSHOP , DBShop.KEY_ITEMNUM, DBShop.KEY_ITEMPRICE }; int[] to = new int[] { R.id.txtSetItem, R.id.txtSetAmount, R.id.txtSetPrice }; // Check the cursor adapter is previously created if ( cursorAdapter == null ) { // There is no previous cursors, create a new one cursorAdapter = new SimpleCursorAdapter(this, R.layout.setshoppinglist, cursor, from, to); showItems.setAdapter(cursorAdapter); } else { // There is a previous adapter // Stop managing its cursor stopManagingCursor ( cursorAdapter.getCursor() ); // Assign the new cursor to the current adapter // The old cursor will be closed cursorAdapter.changeCursor ( cursor ); // No need to refresh the list, it will be automatically refreshed after the adapter's cursor is changed } } 

    Auf diese Weise ist der Adapter der Liste derselbe, den der TextWatcher verwendet, um die Liste zu filtern. Es sollte funktionieren, probieren Sie es und lassen Sie mich wissen, was passiert.

    Ich denke, du solltest es benutzen

     android:hapticFeedbackEnabled="true" android:imeOptions="actionNext" android:nextFocusUp="@id/editeText1" android:nextFocusLeft="@id/edittextText" android:includeFontPadding="true" 

    Sie können unten Änderungen ausprobieren ..

    Nach der Anzeige Ihrer Toast-Artikel aktualisiert / gelöschte Nachricht rufen Sie diese

     cursorAdapter.notifyDataSetChanged(); 

    In deiner setList () -Methode füge folgendes hinzu ..

     cursorAdapter.registerDataSetObserver(new DataSetObserver() { @Override public void onChanged() { super.onChanged(); setList(); }}); 

    Und verschiebe unter code to setList ()

     itemNameEdit.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { cursorAdapter.getFilter().filter(s.toString()); showItems.refreshDrawableState(); } }); getCons = new DBHandlerShop(this, null, null); getCons.open(); cursorAdapter.setFilterQueryProvider(new FilterQueryProvider() { public Cursor runQuery(CharSequence constraint) { return getCons.getChanges((constraint.toString())); } }); 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.