2017-09-19 1 views
1

Ich bin neu in Android und habe mit einer einfachen Stock-Take-App herum gespielt und sind in dieses Problem hineingelaufen:Android TextViews löschen, wenn die Tastatur geöffnet wird?

Auf meinem "set stock" -Bildschirm werden die Produktliste und der aktuelle Lagerbestand aus einer Datenbank abgerufen und in 2 Spalten von TextViews angezeigt, die programmgesteuert generiert werden.

Die onCreate Methode, die aus der Datenbank packt und legt es in die leere Listview in activity_set.xml:

public class SetActivity extends AppCompatActivity{ 
    private static final String TAG = "SetActivity"; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_set); 

     ArrayList<Product> stock = Products.retrieveProducts(this); 
     final ListView mListView = (ListView) findViewById(setList); 
     ProductEditAdapter adapter = new ProductEditAdapter(this,R.layout.adapter_set_layout, stock); 
     mListView.setAdapter(adapter); 

    } 

ProductEditAdapter Klasse:

public class ProductEditAdapter extends ArrayAdapter<Product> { 
    private static final String TAG = "ProductEditAdapter"; 
    private Context mContext; 
    int mResource; 


    public ProductEditAdapter(Context context, int resource, ArrayList<Product> objects){ 
     super(context,resource,objects); 
     mContext = context; 
     mResource = resource; 

    } 

    @NonNull 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     String name = getItem(position).getName(); 
     int stock = getItem(position).getStock(); 
     Product product = new Product(name,stock); 
     LayoutInflater inflater = LayoutInflater.from(mContext); 
     convertView = inflater.inflate(mResource, parent, false); 
     TextView tvName = (TextView) convertView.findViewById(R.id.pie_name); 
     TextView tvCurrentStock = (TextView) convertView.findViewById(R.id.current_stock); 
     tvCurrentStock.setText(String.valueOf(stock)); 
     tvName.setText(name + ":"); 
     tvCurrentStock.setTag(name); 
     return convertView; 
    } 
} 

Die adapter_set_layout.xml es erstellt wird mit:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/adapsetLayout" 
    android:weightSum="100"> 

    <TextView 
     android:gravity="center" 
     android:textAlignment="center" 
     android:text="TextView1" 
     android:layout_width="match_parent" 
     android:layout_height="45dp" 
     android:id="@+id/pie_name" 
     android:layout_weight="20" 
     android:textColor="#000000" 
     android:textStyle="bold" 
    /> 

    <TextView 
     android:gravity="center" 
     android:textAlignment="center" 
     android:text="TextView1" 
     android:layout_width="match_parent" 
     android:layout_height="45dp" 
     android:id="@+id/current_stock" 
     android:layout_weight="80" 
     android:textColor="#000000" 
     android:textStyle="bold" 
     android:onClick="onClick" 
     android:clickable="true" 
     /> 
</LinearLayout> 

Wenn Sie auf den Bestand eines Artikels klicken, erhalten Sie einen Popu p, um eine neue Nummer einzugeben, wo Sie dann auf "OK" klicken können, um das TextView zu aktualisieren, oder auf "Abbrechen", um es nicht zu ändern.

Es gibt dann eine Übermittlungsschaltfläche, die alle TextViews analysiert und die Bestandsnummern jedes Produkts in der Datenbank auf die neuen Werte aktualisiert.

Die geänderten TextView-Werte sind temporär, bis sie submit erreichen. Wenn Sie den Bildschirm verlassen, werden die geänderten Werte wiederhergestellt.

Das OnClick Methode in SetActivity:

public void onClick(View v){ 
    if(v.getId()==R.id.submitButton) { 
     confirmDialog(); 
    } 
    else if(v.getId()==R.id.current_stock) { 
     LinearLayout parent = (LinearLayout) v.getParent(); 
     final TextView pie_stock_view = (TextView) parent.findViewById(current_stock); 
     final TextView pie_name_view = (TextView) parent.findViewById(pie_name); 


     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setTitle(pie_name_view.getText().toString()); 

     final EditText input = new EditText(this); 
     input.setInputType(InputType.TYPE_CLASS_NUMBER); 
     builder.setView(input); 

     builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       pie_stock_view.setText(input.getText().toString()); 
      } 
     }); 
     builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
      } 
     }); 

     builder.show(); 


    } 
    else if(v.getId()==R.id.resetButton) { 
     resetDialog(); 
    } 

} 

Die App funktioniert perfekt im Emulator - wenn Sie eine Bestandsnummer klicken und die Box erscheint, können Sie einfach mit dem Desktop-Tastatur eingeben und auf OK klicken, wird die Aktualisierung so viele Werte wie Sie möchten, bevor Sie senden.

Das Problem auf einem tatsächlichen Gerät ist, wenn die Box erscheint und Sie klicken, es erscheint auf der Bildschirmtastatur und ich denke, das zählt als Verlassen der Aktivität, weil alle aktualisierten Werte zurück zu ihren zurückgesetzt werden generierte Werte, irgendwelche Vorschläge, wie ich das verhindern könnte ?.

Antwort

0

Sie sollten die geänderten Werte in Ihrem Array speichern. Um dies zu tun, verwenden Sie zuerst eine andere Funktion, um Klicks zu erfassen und die Definition von Stock Array nach außerhalb von onCreate zu verschieben. So können Sie Ihren Code dies ändern:

public class SetActivity extends AppCompatActivity{ 
    private static final String TAG = "SetActivity"; 
    ArrayList<Product> stock = null; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_set); 
     if(stock == null) 
      stock = Products.retrieveProducts(this); 
     final ListView mListView = (ListView) findViewById(setList); 
     ProductEditAdapter adapter = new ProductEditAdapter(this,R.layout.adapter_set_layout, stock); 
     mListView.setAdapter(adapter); 


     mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      public void onItemClick(AdapterView parent, View v, int position, long id){ 
       if(v.getId()==R.id.submitButton) { 
        confirmDialog(); 
       } 
       else if(v.getId()==R.id.current_stock) { 
        LinearLayout parent = (LinearLayout) v.getParent(); 
        final TextView pie_stock_view = (TextView) parent.findViewById(current_stock); 
        final TextView pie_name_view = (TextView) parent.findViewById(pie_name); 


        AlertDialog.Builder builder = new AlertDialog.Builder(this); 
        builder.setTitle(pie_name_view.getText().toString()); 

        final EditText input = new EditText(this); 
        input.setInputType(InputType.TYPE_CLASS_NUMBER); 
        builder.setView(input); 

        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
         pie_stock_view.setText(input.getText().toString()); 
         getItem(position).setStock(input.getText().toString()); 
         } 
        }); 
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
         } 
        }); 

        builder.show(); 

       } 
       else if(v.getId()==R.id.resetButton) { 
        resetDialog(); 
       } 

      } 
     }); 
    } 
} 

Eine weitere wichtige Sache ist versuchen, convertView verwenden. Es verhindert Speicherverlust und verbessert die Anwendungsleistung.

@NonNull 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     String name = getItem(position).getName(); 
     int stock = getItem(position).getStock(); 
     Product product = new Product(name,stock); 
     if(convertView != null){ 
      LayoutInflater inflater = LayoutInflater.from(mContext); 
      convertView = inflater.inflate(mResource, parent, false); 
     } 
     TextView tvName = (TextView) convertView.findViewById(R.id.pie_name); 
     TextView tvCurrentStock = (TextView) convertView.findViewById(R.id.current_stock); 
     tvCurrentStock.setText(String.valueOf(stock)); 
     tvName.setText(name + ":"); 
     tvCurrentStock.setTag(name); 
     return convertView; 
    } 
Verwandte Themen