在本文中,我们将使用Android中的Java和XML构建一个Bitcoin Tracker App项目。该应用程序将使用比特币API显示不同国家/地区的比特币当前汇率。有很多免费的API 可用,对于该项目,我们将使用Coinlayer的API 。 API将返回一个JSON,我们将根据需要对其进行解析。此应用程序中只有一个活动。下面给出了一个示例GIF,以了解我们将在本文中做些什么。
分步实施
步骤1:创建一个新项目
要在Android Studio中创建新项目,请参阅如何在Android Studio中创建/启动新项目。请注意,选择Java作为编程语言。
第2步:首先进入编码部分,您必须做一些准备工作
权限:在AndroidManifest.xml文件中添加Internet权限
在themes.xml文件中将样式更改为NoActionBar:
获取API密钥:您需要在Coinlayer上创建一个免费帐户并获取此项目的API密钥。
添加依赖项:
我们需要在应用gradle文件中添加此依赖项以发出HTTP请求
implementation ‘com.loopj.android:android-async-http:1.4.9’
在字符串.xml中添加货币列表:
我们需要在.xml字符串添加所有货币的列表。从这里我们将在活动中将其显示给用户。将以下代码添加到字符串.xml文件中。
XML
Am I Rich?
304.74
Error
Base Currency
Bitcoin Logo
- AUD
- BRL
- CAD
- CNY
- EUR
- GBP
- HKD
- JPY
- PLN
- RUB
- SEK
- USD
- ZAR
XML
XML
XML
Java
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.JsonHttpResponseHandler;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import cz.msebera.android.httpclient.Header;
public class MainActivity extends AppCompatActivity {
// Constants:
// TODO: Create the base URL
private final String BASE_URL = "http://api.coinlayer.com/live?access_key=";
// Member Variables:
TextView mPriceTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPriceTextView = (TextView) findViewById(R.id.priceLabel);
Spinner spinner = (Spinner) findViewById(R.id.currency_spinner);
// Create an ArrayAdapter using the String array and a spinner layout
final ArrayAdapter adapter = ArrayAdapter.createFromResource(this,
R.array.currency_array, R.layout.spinner_item);
// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
// Apply the adapter to the spinner
spinner.setAdapter(adapter);
// TODO: Set an OnItemSelected listener on the spinner
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> adapterView, View view, int i, long l) {
String publicKey = "cd9ebbd0c5c20340b9d638e409f41fb1";
String finalUrl = BASE_URL + publicKey + "&TARGET=" + adapterView.getItemAtPosition(i) + "&symbols=BTC";
Log.d("Clima", "Request fail! Status code: " + finalUrl);
try {
letsDoSomeNetworking(finalUrl);
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onNothingSelected(AdapterView> adapterView) {
}
});
}
// TODO: complete the letsDoSomeNetworking() method
private void letsDoSomeNetworking(String url) throws IOException, JSONException {
AsyncHttpClient client = new AsyncHttpClient();
client.get(url, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
// called when response HTTP status is "200 OK"
Log.d("Clima", "JSON: " + response.toString());
try {
JSONObject price = response.getJSONObject("rates");
String object = price.getString("BTC");
mPriceTextView.setText(object);
} catch (JSONException E) {
E.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable e, JSONObject response) {
// called when response HTTP status is "4XX" (eg. 401, 403, 404)
Log.d("Clima", "Request fail! Status code: " + statusCode);
Log.d("Clima", "Fail response: " + response);
Log.e("ERROR", e.toString());
}
});
}
}
步骤3:使用activity_main.xml文件
XML代码用于构建活动的结构及其样式部分。它包含一个ImageView 在活动的最顶部以显示应用程序的徽标。然后它包含一个TextView 在活动中心显示比特币汇率。最后,我们有一个微调器 在活动底部显示用户可以选择的货币列表。这是一个单一活动的应用程序。以下是activity_main.xml文件的代码。
XML格式
步骤4:创建新的布局资源文件
为了使微调器显示列表,我们还需要创建微调器项目的XML布局以及适配器的项目布局。在app> res> layout> spinner_dropdown_item.xml中添加以下代码。
XML格式
spinner_item.xml文件:
XML格式
步骤5:使用MainActivity。 Java文件
在Java文件中,我们将创建一个函数,该函数将从URL发出HTTP请求。该URL将由API密钥,基本URL和目标货币代码组成。首先,我们将为所有货币列表创建一个适配器,并将其设置为主活动中的Spinner视图。然后,我们将调用函数onItemSelectedListener并获取选定的货币代码。我们将将此代码及其其他部分添加到URL中。然后,我们将调用使HTTP请求获得JSON的函数。我们将解析JSON对象以获得所需货币的选定币种的汇率。下面是MainActivity的代码。 Java文件。在代码内部添加了注释,以更详细地了解代码。
Java
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.JsonHttpResponseHandler;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import cz.msebera.android.httpclient.Header;
public class MainActivity extends AppCompatActivity {
// Constants:
// TODO: Create the base URL
private final String BASE_URL = "http://api.coinlayer.com/live?access_key=";
// Member Variables:
TextView mPriceTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPriceTextView = (TextView) findViewById(R.id.priceLabel);
Spinner spinner = (Spinner) findViewById(R.id.currency_spinner);
// Create an ArrayAdapter using the String array and a spinner layout
final ArrayAdapter adapter = ArrayAdapter.createFromResource(this,
R.array.currency_array, R.layout.spinner_item);
// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
// Apply the adapter to the spinner
spinner.setAdapter(adapter);
// TODO: Set an OnItemSelected listener on the spinner
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> adapterView, View view, int i, long l) {
String publicKey = "cd9ebbd0c5c20340b9d638e409f41fb1";
String finalUrl = BASE_URL + publicKey + "&TARGET=" + adapterView.getItemAtPosition(i) + "&symbols=BTC";
Log.d("Clima", "Request fail! Status code: " + finalUrl);
try {
letsDoSomeNetworking(finalUrl);
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onNothingSelected(AdapterView> adapterView) {
}
});
}
// TODO: complete the letsDoSomeNetworking() method
private void letsDoSomeNetworking(String url) throws IOException, JSONException {
AsyncHttpClient client = new AsyncHttpClient();
client.get(url, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
// called when response HTTP status is "200 OK"
Log.d("Clima", "JSON: " + response.toString());
try {
JSONObject price = response.getJSONObject("rates");
String object = price.getString("BTC");
mPriceTextView.setText(object);
} catch (JSONException E) {
E.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable e, JSONObject response) {
// called when response HTTP status is "4XX" (eg. 401, 403, 404)
Log.d("Clima", "Request fail! Status code: " + statusCode);
Log.d("Clima", "Fail response: " + response);
Log.e("ERROR", e.toString());
}
});
}
}
输出:
GitHub链接: https : //github.com/namanjha007/BitcoinTracker