2017-01-16 47 views
0

autocompletetextview,我想只有那些文字是在这里,我所有的名字存储和自动建议显示我的原料资源文本文件列表 如果用户尝试进入其他不同文本比上市然后再验证表明:“选定的名称只接受”Autocompletetextview只能从下拉菜单中选择文本向下上市

public class MainActivity extends AppCompatActivity { 

    Button submit; 
    TextView timerInfo; 
    TextView timertext; 
    SharedPreferences pref; 
    CountDownTimer countDownTimer; 
    Scanner scanner; 
    ArrayList<String> list; 
    ArrayAdapter<String> adapter; 
    AutoCompleteTextView autolist; 
    AccessibilityService.SoftKeyboardController keyboardController; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     scanner= new Scanner(getResources().openRawResource(R.raw.names)).useDelimiter("\n"); 
     list=new ArrayList<>(); 

     getList(); 


     autolist=(AutoCompleteTextView) findViewById(R.id.list_names); 

     autolist.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 
       if(hasFocus && v.getId()==R.id.list_names){ 
        autolist.setCursorVisible(true); 
        populate(); 
       } 
       else{ 
        ((AutoCompleteTextView)v).performValidation(); 
        autolist.setCursorVisible(false); 
       } 
      } 
     }); 
    autolist.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      autolist.setCursorVisible(true); 
     } 
    }); 


     autolist.setOnKeyListener(new View.OnKeyListener() { 
      @Override 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 
       if (event != null&& (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) { 
        autolist.setCursorVisible(false); 
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
        imm.hideSoftInputFromWindow(autolist.getWindowToken(), 0); 
        return true; 
       } 

       return false; 
      } 

     }); 
     pref=getSharedPreferences("AppClose",MODE_PRIVATE); 

      String abc=pref.getString("demover",""); 
     if(abc=="demover"){ 
      finish(); 
     } 

     submit=(Button) findViewById(R.id.timerStart); 
     timerInfo=(TextView) findViewById(R.id.timerInfo); 
     timertext=(TextView) findViewById(R.id.timertxt); 

     submit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       timertext.setText("Time Left :"); 
       submit.setVisibility(View.INVISIBLE); 
       countDownTimer=new CountDownTimer(30000,1000){ 

        @Override 
        public void onTick(long millisUntilFinished) { 
         timerInfo.setText(String.valueOf((int) (millisUntilFinished/1000))); 

        } 

        @Override 
        public void onFinish() { 
         pref.edit().putString("demover","demover").apply(); 
         finish(); 
        } 
       }.start(); 
      } 
     }); 

autolist.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     isSelectedText = true; 
    } 

}); 
    autolist.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
      isSelectedText = false; 
     } 

     @Override 
     public void afterTextChanged(Editable editable) { 
       if(isSelectedText){ 
        Toast.makeText(MainActivity.this, "nice", Toast.LENGTH_SHORT).show(); 
       } 
      else{ 
        Toast.makeText(MainActivity.this, "not nice", Toast.LENGTH_SHORT).show(); 
       } 
     } 
    }); 
    } 
    class Validator implements AutoCompleteTextView.Validator { 

     @Override 
     public boolean isValid(CharSequence text) { 
      Log.v("Test", "Checking if valid: "+ text); 
      Arrays.sort(new InputStream[]{getResources().openRawResource(R.raw.names)}); 
      if (Arrays.binarySearch(new InputStream[]{getResources().openRawResource(R.raw.names)}, text.toString()) > 0) { 
       return true; 
      } 

      return false; 
     } 

     @Override 
     public CharSequence fixText(CharSequence invalidText) { 
      Toast.makeText(MainActivity.this, "Fixed", Toast.LENGTH_SHORT).show(); 

      /* I'm just returning an empty string here, so the field will be blanked, 
      * but you could put any kind of action here, like popping up a dialog? 
      * 
      * Whatever value you return here must be in the list of valid words. 
      */ 
      return "Digger"; 
     } 
    } 


    public void getList(){ 
     try{ 
      while(scanner.hasNextLine()){ 
       list.add(scanner.next()); 
      } 
     }catch (Exception e){e.printStackTrace();} 
    } 
    public void populate(){ 
     adapter = new ArrayAdapter<String> 
       (this,android.R.layout.simple_list_item_1,list); 
     autolist.setAdapter(adapter); 
    } 

} 

我已经使用上somel调试并显示暂停线程。

我想要什么:采取只有那些文字输入,在自动建议

回答

2
  1. AutoCompleteTextView有建议项目中的监听器。所以,如果单击项目,然后将状态设置为别的真的,那总寄 假
  2. 用户可以选择和修改,以便添加TextWatcher如果文本改变时,状态更改为假。
  3. 与做你所希望的行动的if/else从isSelectedText
autoText.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
      isSelectedText = true; 
     } 

    }); 


    autoText.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
      isSelectedText = false; 
     } 

     @Override 
     public void afterTextChanged(Editable editable) { 

     } 
    }); 
+0

会不会有任何冲突假设您选择从下拉项下好了,现在你要改变,从列表中选择另一个项目,以便onTextChanged会叫始终即使你选择从建议的文字仍然会是假的isSelectedText将假 – SamH67

+0

改变文本>假>选择项目>真。因此,没有可能的冲突 –

+0

完美谢谢:) – SamH67

0

您可以使用,而不是使用扫描仪这一点。

try { 
     Resources res = getResources(); 
     InputStream in = res.openRawResource(R.raw.names); 

     byte[] byte = new byte[in.available()]; 
     in .read(btye); 
     list.add(new String(btye)); 
    } catch (Exception e) { 
     e.printStackTrace(); 

    } 
+0

我想我得到的ArrayList中的名单,但你还没有告诉我什么,我实际上已经要求。如何采取输入只能从意见箱,如果进入了自己的东西,然后显示“东西” – SamH67