Powinieneś mieć MainActivity.java
lub jakiś Activity
który tworzy instancję QuoteBank
. co chcesz konstruktor podjąć w parametr kontekstu:
Konfiguracja prywatnej zmiennej w QuoteBank.java
:
private Context mContext;
Instalator się konstruktora:
public QuoteBank(Context context) {
this.mContext = context;
}
Następnie oznacz ją w swojej działalności,
QuoteBank quoteBank = new QuoteBank(context);
Zmienna kontekstowa może być wywołana w ciągu działanie według polecenia this
lub Activity.this
, w którym zastępujesz "Aktywność" nazwą swojej działalności. Ewentualnie, jeśli jesteś w obrębie fragmentu, możesz uzyskać kontekst z obiektu View
w swojej metodzie onCreateView(...)
. Zwykle dzwoniąc pod numer view.getContext()
.
Teraz w swojej metodzie, gdzie jesteś chwytając aktywów, można skorzystać z kontekstu:
InputStream is = mContext.getAssets().open("QuotesMonkeyBusiness.txt")
Ponieważ używasz android studio można utworzyć metodę main(String[] args) { ... }
i uruchomić go lub po prostu uruchomić emulator i użyj go Log.d(...)
, aby wyświetlić wyjście z pliku.
Alternatywnie można użyć następującej metody, a także:
AssetManager am = mContext.getAssets();
InputStream is = am.open("QuotesMonkeyBusiness.txt");
Może też sensu mieć QuoteBank
jako singleton instancji, które mogłyby zwiększyć efektywność chociaż wszystko zależy od wymagań, może coś takiego:
List<String> allTextLines = QuoteBank.readFromFile(context, path_to_file);
a potem w swojej klasie QuoteBank.java
można mieć metodę tak:
/**
* Created by AndyRoid on 5/23/15.
*/
public class QuoteBank {
private Context mContext;
public QuoteBank(Context context) {
this.mContext = context;
}
public List<String> readLine(String path) {
List<String> mLines = new ArrayList<>();
AssetManager am = mContext.getAssets();
try {
InputStream is = am.open(path);
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = reader.readLine()) != null)
mLines.add(line);
} catch (IOException e) {
e.printStackTrace();
}
return mLines;
}
}
a następnie w moim MainActivity.java
klasie mam następujące:
/**
* Created by AndyRoid on 5/23/15.
*/
public class MainActivity extends AppCompatActivity {
public static final String TAG = MainActivity.class.getSimpleName();
public static final String mPath = "adventur.txt";
private QuoteBank mQuoteBank;
private List<String> mLines;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mQuoteBank = new QuoteBank(this);
mLines = mQuoteBank.readLine(mPath);
for (String string : mLines)
Log.d(TAG, string);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
To jest mój struktury projektu:
Jest to plik adventur.txt
Pobrałem od A losowa baza danych:
To moje wyjście dziennika:
UPDATE: Dlaczego nie należy używać skanera w Androidzie
Z oficjalnej dokumentacji:
http://developer.android.com/reference/java/util/Scanner.html
Ta klasa nie jest tak przydatna, jak mogłoby się wydawać. Jest bardzo nieefektywny w komunikacji między maszynami; powinieneś używać JSON, protobufs, a nawet XML do tego. Bardzo proste zastosowania mogą uciec z splitem (String). Aby uzyskać dane wejściowe od ludzi, użycie wyrażeń regularnych specyficznych dla regionu powoduje, że jest on nie tylko drogi, ale również nieco nieprzewidywalny. Klasa skanera nie jest wątkowa.
UWAGA KOŃCOWA:
bardzo proponuję zapoznać się z dokumentacją na wszystkich obiektach wykorzystywanych tu więc można zrozumieć ten proces.
Dzięki część o co konstruktor pomaga. Nadal dostaję wyjątek wskaźnika pustego w 'AssetManager am = mContext.getAssets();' mam kontekst zadeklarowany jak 'Activity context = new Activity();' w głównej działalności i tuż przed tą linią mam 'this.mContext = context ; ' –
i czy nie ma sposobu, aby to zrobić po prostu wprowadzając względną lokalizację pliku do klasy pliku? Czuję, że to będzie łatwiejsze? Nie jestem pewien, czy inputStream będzie działał ze skanerem. Metody extine() –
Zamiast ** Activity context = new Activity(); ** aby pobrać kontekst, użyj polecenia ** this ** lub ** YOURACTIVITYNAME.this ** . Powinno to wyglądać tak: ** QuoteBank qb = new QuoteBank (this); ** lub ** QuoteBank qb = new QuoteBank (YOURACTIVITYNAME.this); ** Zakładając, że nie poszliście na singletową trasę. – AndyRoid