2017-01-27 17 views
2

Привет, я новичок в программировании на Android.Данные Spinner в Main Activity теряются после использования камеры для сканирования QR-кода

Когда загружается mainacitivity, я могу получить данные с сервера sql и заполнить его в spinner. Я могу выбрать элемент из spinner и сканировать qrcode/barcode. Как только я остановлю камеру и вернусь к MainActivity, я не могу найти никаких данных в счетчике. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация по этому вопросу. Я предоставил весь код в файле MainActivity.java.

package com.example.vxt.barcodescanner; 
    import android.support.v7.app.AppCompatActivity; 
    import android.os.Bundle; 
    import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.Button;//import android.widget.ProgressBar;import android.widget.Spinner;import android.app.AlertDialog;import android.content.DialogInterface;import com.google.zxing.Result;import me.dm7.barcodescanner.zxing.ZXingScannerView;import java.sql.Connection;import java.sql.ResultSet;import java.sql.PreparedStatement;import java.util.ArrayList;import static com.example.vxt.barcodescanner.R.id.spinner; 

    public class MainActivity extends AppCompatActivity implements ZXingScannerView.ResultHandler{ 
    ConnectionClass connectionClass; 
    //ProgressBar pbbar; 
    Spinner spinnerProducts; 
    private ZXingScannerView mScannerView; 
    ArrayList<String> scanned_data = new ArrayList<String>(); 
    ArrayList<String> data = new ArrayList<String>(); 
    String productSelected; 
    Button scan, pushToDB; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     connectionClass = new ConnectionClass(); 
     //pbbar = (ProgressBar) findViewById(R.id.pbbar); 
     //pbbar.setVisibility(View.VISIBLE); 
     spinnerProducts = (Spinner) findViewById(spinner); 
     scan = (Button) findViewById(R.id.button); 
     pushToDB = (Button) findViewById(R.id.button3); 
     try { 
      Connection con = connectionClass.CONN(); 
      if (con != null) { 

       String query = "select * from Products"; 
       PreparedStatement preparedStatement = con.prepareStatement(query); 
       ResultSet rs = preparedStatement.executeQuery(); 
       data.add("<--- Select a Product --->"); 
       while(rs.next()){ 
        String product = rs.getString("Product"); 
        String id = Integer.toString(rs.getInt("Id")); 
        data.add(product + "----" + id); 
       } 

       ArrayAdapter NoCoreAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1, data); 
       spinnerProducts.setAdapter(NoCoreAdapter); 
       //pbbar.setVisibility(View.GONE); 
       scan.setEnabled(false); 
       pushToDB.setEnabled(false); 
      } 
     } catch (Exception ex) { 
      //pbbar.setVisibility(View.GONE); 
      ex.printStackTrace(); 
     } 
     spinnerProducts.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
       if(spinnerProducts.getSelectedItemPosition() != 0){ 
        scan.setEnabled(true); 
       } 
       productSelected = spinnerProducts.getSelectedItem().toString(); 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 

      } 
     }); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { /* do nothing */ } 


    public void onClick(View v){ 
     mScannerView = new ZXingScannerView(MainActivity.this); 
     setContentView(mScannerView); 
     mScannerView.setResultHandler(this); 
     mScannerView.startCamera(); 
    } 

    public void onClickDB(View v){ 
     //pbbar.setVisibility(View.VISIBLE); 
     pushToDB.setEnabled(false); 
     try { 
      Connection con = connectionClass.CONN(); 
      if (con != null) { 
       String query, query1; 
       PreparedStatement preparedStatement, preparedStatement1; // = con.prepareStatement(query); 
       ResultSet rs; // = preparedStatement.executeQuery(); 
       String[] splArray; 
       //SimpleCursorAdapter adapter = (SimpleCursorAdapter) spinnerProducts.getAdapter(); 
       for (int position = 1; position < scanned_data.size(); position++) { 
        splArray = scanned_data.get(position).split(","); 
        query = "select * from Products_Barcode where ProductId ='" + splArray[1] + "'"; 
        preparedStatement = con.prepareStatement(query); 
        rs = preparedStatement.executeQuery(); 
        if(rs.next()){ 
         query1 = "Update Products_Barcode set Barcode = '" + splArray[2] + "' where ProductId = '" + splArray[1] + "'"; 
         preparedStatement1 = con.prepareStatement(query1); 
         preparedStatement1.executeQuery(); 
        } 
        else{ 
         query1 = "insert into Products_Barcode values ('" + splArray[1] + "','" + splArray[0] + "','" + splArray[2] + "');"; 
         preparedStatement1 = con.prepareStatement(query1); 
         preparedStatement1.executeQuery(); 
        } 
       } 
       AlertDialog.Builder builder = new AlertDialog.Builder(this); 
       builder.setMessage("Data tranferred successfully") 
         .setPositiveButton("Yes",new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog,int id) { 
           dialog.cancel(); 
          } 
         }); 

       AlertDialog alertDialog = builder.create(); 
       alertDialog.show(); 
      } 
     } catch (Exception ex) { 
      //pbbar.setVisibility(View.GONE); 
      ex.printStackTrace(); 
     } 
    } 

    @Override 
    protected void onPause(){ 
     super.onPause(); 
     mScannerView.stopCamera(); 
    } 


    @Override 
    public void handleResult(Result result) { 
     //if(chk == 0){ 
     Log.v("handleResult", result.getText()); 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     String source_text = result.getText(); 
     String prod = productSelected.replace("----", ","); 
     scanned_data.add(prod + "," + source_text); 
     builder.setTitle("Scan Result"); 
     builder.setMessage("Scan complete") 

       //chk = 1; 
       .setPositiveButton("Yes",new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog,int id) { 
         // if this button is clicked, close 
         // current activity 
         dialog.cancel(); 
          /*chk = 1; 
          mScannerView.resumeCameraPreview(MainActivity.this);*/ 
        } 
       }); 
     spinnerProducts.setSelection(0); 
     scan.setEnabled(false); 
     if(!pushToDB.isEnabled()){ 
      pushToDB.setEnabled(true); 
     } 
     mScannerView.stopCamera(); 
     setContentView(R.layout.activity_main); 
     //pbbar.setVisibility(View.GONE); 
     ArrayAdapter NoCoreAdapter = new ArrayAdapter(MainActivity.this,android.R.layout.simple_spinner_item, data); 
     NoCoreAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spinnerProducts.setAdapter(NoCoreAdapter); 

     AlertDialog alertDialog = builder.create(); 
     alertDialog.show(); 

    } 
} 
+0

Вы можете попробовать перевести SQL-соединение на отдельный метод и назвать его как из OnCreate, так и OnResume? я предполагаю, что spinner получает повторно заполненный OnResume, но поскольку никакого кода там нет, он теряет данные. Возможно, я ошибаюсь. – Phantomazi

+0

@Phantomazi спасибо. Я попробовал вашу идею создания отдельного метода и назвал его onCreate и onResume. У счетчика в начале было два набора данных. Но когда я сканирую штрих-код и возвращаюсь к Activity_main, счетчик пуст. – venutamizh

ответ

0

Вам необходимо сохранить данные об изгибе где-нибудь внутри метода .

@Override 
protected void onPause(){ 
    Data data = spinner.getData(); //Implement your own logic 
} 

Когда Вы возвращаетесь к MainActivity вашему методу onResume называются, где вы должны кормить данные обратно к вертушке.

@Override 
protected void onResume(){ 
    spinner.setData(data); //Implement your own logic 
} 

[EDIT]

Проблема заключается в том, что вы используете setContentView() несколько раз, что является плохой практикой. В соответствии с Android documentation

Задайте содержимое деятельности явным образом. Это представление помещается непосредственно в иерархию представлений активности.

Если вы хотите достичь того, чего хотите в настоящее время, вы должны использовать фрагменты.

Вкратце, не назовите setContentView() несколько раз. Используйте fragment, чтобы показать несколько xml без изменения активности.

+0

Сделано ошибкой! Ред. Проверьте последнюю. –

+0

Я изменил код, как вы посоветовали, но я не могу заставить его работать. Должна быть глупая ошибка, но не могла ее найти. Я сделал модифицированный код в виде txt-файла. Мог бы пройти через это один раз и дать мне предложение. Спасибо. https://drive.google.com/open?id=0B1xgv6ovbMbWSXB5c2Q4UDltSHM – venutamizh

+0

Попробуйте также вызвать 'loadProducts()' методом 'onResume'. Удалите 'loadProducts()' и 'fillSpinner()' из 'onCreate()', потому что когда даже когда ваша активность запускается в первый раз, вызывается 'onResume()'. –

 Смежные вопросы

  • Нет связанных вопросов^_^