2017-06-22 81 views
0

我正在创建一个应用程序,该应用程序针对给定的搜索词或首字母缩写词搜索我的文本文件。这是我真正创建的第一个应用程序。文本文件的格式如下:acronym%term%definition。我有一个InputStream和一个BufferedReader逐行通过文件。然后我用百分号分割它,并使用我创建的Triple类将字符串放入三元组中,并将该Triple添加到ArrayList。我的下一个函数应该搜索包含搜索缩略词或术语的Triple的ArrayList。如果无法找到首字母缩写词,则会转到InvalidAcronym活动。如果它在那里,它将进入ValidAcronym活动。出于某种原因,唯一触发的活动是InvalidAcronym活动。我认为这与将行添加到ArrayList有关。我原本只是使用HashMaps的缩写和定义工作。有人可以帮我吗?这里是我的代码:在Android应用程序中搜索列表并显示答案

package com.redacted.laurenanderson.acronymlookup; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.v4.util.Pair; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.ImageButton; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.HashMap; 


public class Search extends AppCompatActivity{ 
    public EditText mEdit; 
    public static String currAc; 
    // public static HashMap<String,String> acros = new HashMap<String,String>(){{ 
    //add all currently known thingies. 

//}}; 
public static ArrayList<Triple> acros2 = new ArrayList<Triple>(); 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_search); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    InputStream is = this.getResources().openRawResource(R.raw.acronyms2); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 

    String[] str; 
    //String FILENAME = "acronyms.txt"; 
    String FILENAME = "acronyms2.txt"; 



    try { 
     String s = reader.readLine(); 
     while (s != null){ 
      //str = s.split(" ",2); 
      //acros.put(str[0],str[1]); 
      //THIS IS GOING TO BE THE REPLACEMENT 
      str = s.split("%",3); 
      System.out.println(str.toString()); 
      Triple<String,String,String> acro = new Triple<String,String,String>(str[0],str[1],str[2]); 
      acros2.add(acro); 
      s = reader.readLine(); 
     } 

    } 
    catch(IOException e){ 
     System.out.println("OH NO"); 
     return; 
    } 


    mEdit = (EditText)findViewById(R.id.acroterm); 
    //FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.home); 
    //fab.setImageResource(R.drawable.ic_search); 
    ImageButton fab = (ImageButton) findViewById(R.id.search); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 


     /* if(acros.containsKey(mEdit.getText().toString())){ 
       currAc = mEdit.getText().toString(); 
       Intent intent1 = new Intent(view.getContext(), ValidAcronym.class); 
       view.getContext().startActivity(intent1); 
      } 
      else{ 
       Intent intent2 = new Intent(view.getContext(), InvalidAcronym.class); 
       view.getContext().startActivity(intent2); 
      }*/ 

      for(Triple triple: acros2){ 
       currAc = mEdit.getText().toString(); 
       if(triple.contains(currAc)){ 
        Intent intent1 = new Intent(view.getContext(), ValidAcronym.class); 
        view.getContext().startActivity(intent1); 
       } 

      } 
      Intent intent2 = new Intent(view.getContext(), InvalidAcronym.class); 
      view.getContext().startActivity(intent2); 


     } 
    }); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
} 
/*public HashMap<String,String> getMap(){ 
    return acros; 
}*/ 
public ArrayList<Triple> getList(){return acros2;} 

/*public static Pair<String,String> returnAcro(String s){ 
    Pair<String,String> p = new Pair<String,String>(s,acros.get(s)); 
    //Triple<String,String,String> p = new Triple<String,String,String>(s, triple.second(),triple.third()); 
    return p; 
}*/ 
public static Triple<String,String,String> returnAcro2(String s){ 
    for(Triple triple : acros2){ 
     if(triple.contains(s)){ 
      return triple; 
     } 
    } 
    return null; 
}} 
+1

只是一个想法,但如果声明我会把一回在于,在一个开始你的有效活动 –

+0

不知何故,完全解决了这个问题。你应该把它作为答案,所以我可以给你信用! – CSRenA

回答

0

这两个活动都可能开始。我没有运行你的代码。但似乎InvalidAcronym Activity在ValidAcronym之后启动,因此可见。

 for(Triple triple: acros2){ 
      currAc = mEdit.getText().toString(); 
      if(triple.contains(currAc)){ 
       Intent intent1 = new Intent(view.getContext(), ValidAcronym.class); 
       view.getContext().startActivity(intent1); 
      } 

    } 
     Intent intent2 = new Intent(view.getContext(), InvalidAcronym.class); 
     view.getContext().startActivity(intent2); 

开始活动后,执行不会停止。因此,即使在字符串匹配之后,它也会启动InvalidAcronym。您可以使用一个标志并打破如下所示。

 boolean flag = true; 
     for(Triple triple: acros2){ 
      currAc = mEdit.getText().toString(); 
      if(triple.contains(currAc)){ 
       Intent intent1 = new Intent(view.getContext(), ValidAcronym.class); 
       view.getContext().startActivity(intent1); 
       flag = false; 
       break; 
      } 
     } 
     Intent intent2 = new Intent(view.getContext(), InvalidAcronym.class); 
     if(flag){ 
      view.getContext().startActivity(intent2); 
     } 
+0

谢谢!我用了一个回报,它的工作原理,但这真的帮助我理解为什么会发生。 – CSRenA

+0

谢谢。 BTW返回将不允许您在循环之后执行任何进一步的代码。如果你需要在onCreate()后面附加一些东西,你应该使用break和flag或任何等价的东西。 –

0

所以在onClickListener里面的原代码:

/*It goes through this loop */ 
for(Triple triple: acros2){ 
    currAc = mEdit.getText().toString(); 
    /*Matches at the contains*/ 
    if(triple.contains(currAc)){ 
      Intent intent1 = new Intent(view.getContext(), ValidAcronym.class); 
      view.getContext().startActivity(intent1); 
      /*Starts The activity*/ 
    } 
    /*Keeps Going*/ 
} 
/*Still going*/ 
Intent intent2 = new Intent(view.getContext(), InvalidAcronym.class); 
view.getContext().startActivity(intent2); 
/*Starts the InvalidAcronym activity, and shows it on top of everything will happen whether or not the acronym is valid*/ 

因此,要解决这个问题:

for(Triple triple: acros2){ 
    currAc = mEdit.getText().toString(); 
    if(triple.contains(currAc)){ 
     Intent intent1 = new Intent(view.getContext(), ValidAcronym.class); 
     view.getContext().startActivity(intent1); 
     /*end the onClick function early because it is valid and we don't need to keep going*/ 
     //This should show the correct activity now. 
     return; 
    } 

} 
//This won't be hit when it is valid 
Intent intent2 = new Intent(view.getContext(), InvalidAcronym.class); 
view.getContext().startActivity(intent2); 
相关问题