2017-09-19 1 views
1

나는 안드로이드를 처음 접했고 간단한 재고 테이크 앱으로 놀아서이 문제를 해결했습니다 :키보드를 열면 Android TextViews가 지워 집니까?

"재고 세트"화면에서 제품 목록과 현재 재고가 데이터베이스에서 수집됩니다 프로그래밍 방식으로 생성 된 TextViews의 2 열로 표시됩니다.

데이터베이스에서 잡고 activity_set.xml에 빈의 ListView에 그것을 박았에서 onCreate 방법 :

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 클래스

을 :

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; 
    } 
} 

adapter_set_layout.xml이가 생성되는 로 :

<?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> 

당신이 항목의 주식을 클릭하면이 popu을 부여하고 p를 눌러 새 번호를 입력 한 다음 "확인"을 클릭하여 TextView를 업데이트하거나 "취소"를 클릭하여 수정할 수 있습니다.

모든 TextViews를 구문 분석하고 데이터베이스의 각 제품의 재고 번호를 새 값으로 업데이트하는 제출 버튼이 있습니다.

변경된 TextView 값은 제출을 기다릴 때까지 일시적이며 화면을 떠날 때 원래 값으로 돌아갑니다. 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(); 
    } 

} 

앱이 에뮬레이터에서 완벽하게 작동합니다 - 당신이 재고 번호를 클릭하고 상자가 그냥 바탕 화면 키보드로 입력하고 확인, 업데이트를 클릭하면, 팝업 때 제출하기 전에 원하는만큼의 가치를 제공하십시오.

실제 장치의 문제는 상자가 튀어 나와서 화면 키보드가 튀어 나오면 모든 업데이트 된 값이 해당 컴퓨터로 다시 설정되므로 활동을 떠나는 것으로 생각됩니다. 생성 된 값, 어떤 제안을 어떻게 방지 할 수 있습니까?.

답변

0

배열에 변경된 값을 저장해야합니다. 먼저 클릭 수를 포착하고 주식 배열의 정의를 onCreate 외부로 이동하는 또 다른 함수를 사용합니다. 코드를 다음과 같이 바꿀 수 있습니다 :

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(); 
       } 

      } 
     }); 
    } 
} 

또 다른 중요한 것은 convertView를 사용해보십시오. 메모리 누수를 방지하고 응용 프로그램의 성능을 향상시킵니다.

@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; 
    } 
관련 문제