2017-06-22 37 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); 
相關問題