大佬教程收集整理的这篇文章主要介绍了按转换按钮(带 API)使货币转换器应用程序崩溃,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试为我的学校项目制作一个带有 API 的货币转换器。转换器被编码为 Fragment
。每次我尝试按 button
转换一对时,应用程序都会崩溃。这是我得到的错误:
E/AndroIDRuntime: FATAL EXCEPTION: main
Process: com.example.LulusApp,PID: 1675
java.lang.NoSuchMethodError: No static method Metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; in class Ljava/lang/invoke/LambdaMetafactory; or its super classes (declaration of 'java.lang.invoke.LambdaMetafactory' appears in /apex/com.androID.art/javalib/core-oj.jar)
at okhttp3.internal.Util.<clinit>(Util.java:87)
at okhttp3.internal.Util.skipLeadingAsciiWhitespace(Util.java:321)
at okhttp3.httpUrl$Builder.parse(httpUrl.java:1313)
at okhttp3.httpUrl.get(httpUrl.java:917)
at retrofit2.Retrofit$Builder.baseUrl(Retrofit.java:492)
at com.example.LulusApp.Retrofit.RetrofitBuilder.getRetrofiTinstance(RetrofitBuilder.java:11)
at com.example.LulusApp.CurrencyConverterFragment$1.onClick(CurrencyConverterFragment.java:53)
at androID.vIEw.VIEw.performClick(VIEw.java:7448)
at androID.vIEw.VIEw.performClickInternal(VIEw.java:7425)
at androID.vIEw.VIEw.access$3600(VIEw.java:810)
at androID.vIEw.VIEw$PerformClick.run(VIEw.java:28305)
at androID.os.Handler.handleCallBACk(Handler.java:938)
at androID.os.Handler.dispatchmessage(Handler.java:99)
at androID.os.Looper.loop(Looper.java:223)
at androID.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.androID.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:947)
I/Process: Sending signal. PID: 1675 SIG: 9
这是我的CurrencyConverterFragment.java
,万物互联:
public class CurrencyConverterFragment extends Fragment {
public CurrencyConverterFragment() {
// required empty public constructor
}
@OverrIDe
public VIEw onCreateVIEw(LayoutInflater inflater,VIEwGroup container,Bundle savedInstanceStatE) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_currency_converter,container,falsE);
final EditText currencyamount = (EditText) vIEw.findVIEwByID(R.ID.currency_amount);
final EditText currencyResult = (EditText) vIEw.findVIEwByID(R.ID.currency_result);
final Spinner currencyFromDropdown = (Spinner) vIEw.findVIEwByID(R.ID.currency_from);
final Spinner currencyToDropdown = (Spinner) vIEw.findVIEwByID(R.ID.currency_to);
button buttonResult = (button) vIEw.findVIEwByID(R.ID.button_result);
//Adding Functionality
String[] dropDownList = {"USD","EUR","CHF"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(),R.layout.support_simple_spinner_dropdown_item,dropDownList);
currencyFromDropdown.setAdapter(adapter);
currencyToDropdown.setAdapter(adapter);
buttonResult.setonClickListener(new VIEw.onClickListener() {
@OverrIDe
public voID onClick(VIEw v) {
//Below is error line 53
RetrofiTinterface retrofiTinterface = RetrofitBuilder.getRetrofiTinstance().create(RetrofiTinterface.class);
Call<JsonObject> call = retrofiTinterface.getExchangeCurrency(currencyFromDropdown.getSELEctedItem().toString());
call.enqueue(new CallBACk<JsonObject>() {
@OverrIDe
public voID onResponse(Call<JsonObject> call,Response<JsonObject> responsE) {
Log.d("response",String.valueOf(response.body()));
JsonObject res = response.body();
JsonObject conversion_rates = res.getAsJsonObject("conversion_rates");
double amount = Double.parseDouble(currencyamount.getText().toString());
double multiplIEr = Double.parseDouble(conversion_rates.get(currencyToDropdown.getSELEctedItem().toString()).toString());
double result = amount * multiplIEr;
currencyResult.setText(String.valueOf(result));
}
@OverrIDe
public voID onFailure(Call<JsonObject> call,Throwable t) {
}
});
}
});
return vIEw;
}
}
这是包含 2 .xml layout
、2 Spinner
、Some EditText
和 TextVIEw
的 button
文件:
<?xml version="1.0" enCoding="utf-8"?>
<ScrollVIEw xmlns:androID="http://scheR_795_11845@as.androID.com/apk/res/androID"
xmlns:tools="http://scheR_795_11845@as.androID.com/tools"
androID:layout_wIDth="match_parent"
androID:layout_height="match_parent"
androID:orIEntation="vertical"
tools:context=".CurrencyConverterFragment">
<linearLayout
androID:layout_wIDth="match_parent"
androID:layout_height="match_parent"
androID:orIEntation="vertical">
<TextVIEw
androID:ID="@+ID/Converter_title"
androID:layout_wIDth="wrap_content"
androID:layout_height="wrap_content"
androID:text="Currency Converter"
androID:textSize="36dp"
androID:textAppearance="@style/TextAppearance.AppCompat.Medium"
androID:textcolor="?attr/colorPriMary"
androID:layout_margin="20dp"
androID:layout_gravity="center"/>
<linearLayout
androID:layout_wIDth="wrap_content"
androID:layout_height="wrap_content"
androID:orIEntation="vertical"
androID:layout_gravity="center">
<TextVIEw
androID:layout_wIDth="wrap_content"
androID:layout_height="wrap_content"
androID:text="amount to be converted"
androID:textSize="16dp"
androID:textAppearance="@style/TextAppearance.AppCompat.Medium"
androID:textcolor="?attr/colorPriMary"
androID:layout_margin="20dp"/>
<EditText
androID:ID="@+ID/currency_amount"
androID:layout_wIDth="250dp"
androID:layout_height="40dp"
androID:layout_gravity="center"
androID:textcolor="?attr/colorPriMary"
androID:layout_marginBottom="20dp"
androID:layout_marginleft="20dp"
androID:layout_marginRight="20dp"/>
<TextVIEw
androID:layout_wIDth="wrap_content"
androID:layout_height="wrap_content"
androID:text="From Currency:"
androID:textSize="16dp"
androID:textAppearance="@style/TextAppearance.AppCompat.Medium"
androID:textcolor="?attr/colorPriMary"
androID:layout_margin="20dp"/>
<relativeLayout
androID:layout_wIDth="wrap_content"
androID:layout_height="wrap_content"
androID:BACkground="@drawable/border_spinner_currency_converter"
androID:layout_marginBottom="20dp"
androID:layout_marginleft="20dp"
androID:layout_marginRight="20dp">
<Spinner
androID:layout_wIDth="250dp"
androID:layout_height="40dp"
androID:ID="@+ID/currency_from"
androID:layout_gravity="center"/>
</relativeLayout>
<TextVIEw
androID:layout_wIDth="wrap_content"
androID:layout_height="wrap_content"
androID:text="To Currency:"
androID:textSize="16dp"
androID:textAppearance="@style/TextAppearance.AppCompat.Medium"
androID:textcolor="?attr/colorPriMary"
androID:layout_margin="20dp"/>
<relativeLayout
androID:layout_wIDth="wrap_content"
androID:layout_height="wrap_content"
androID:BACkground="@drawable/border_spinner_currency_converter"
androID:layout_marginBottom="20dp"
androID:layout_marginleft="20dp"
androID:layout_marginRight="20dp">
<Spinner
androID:layout_wIDth="250dp"
androID:layout_height="40dp"
androID:ID="@+ID/currency_to"
androID:layout_gravity="center"/>
</relativeLayout>
</linearLayout>
<button
androID:ID="@+ID/button_result"
androID:layout_wIDth="wrap_content"
androID:layout_height="wrap_content"
androID:layout_margin="20dp"
androID:layout_gravity="center"
androID:text="Convert"
androID:textcolor="#FFFFFF"
androID:BACkground="@drawable/custom_button_currency_converter"/>
<EditText
androID:ID="@+ID/currency_result"
androID:layout_wIDth="250dp"
androID:layout_height="40dp"
androID:layout_gravity="center"
androID:layout_marginBottom="20dp"
androID:layout_marginleft="20dp"
androID:layout_marginRight="20dp"
androID:hint="Result"/>
</linearLayout>
</ScrollVIEw>
我使用的 API 的 RetrofitBuilder.java
:
public class RetrofitBuilder {
private static Retrofit retrofit;
public static Retrofit getRetrofiTinstance(){
if(retrofit == null){
retrofit = new Retrofit.builder()
//Below is error line 11:
.baseUrl("https://v6.exchangerate-API.com/v6/9b7aaded7a6b901a07526894/")
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
最后通过 interface
将 @GET
转换为 @Path
特定货币。
public interface RetrofiTinterface {
@GET("latest/{Currency}")
Call<JsonObject> getExchangeCurrency(@Path("currency")String currency);
}
改造类不是也不能是静态的。如果类是静态的,则不能包含任何非静态成员。这就是为什么运行时错误指出没有这样的静态方法。在 onCreate 方法中获取 Retrofit 实例,或者以 Context 为参数为 RetrofitBuilder 类创建一个构造函数方法。然后构建接口并在那里执行 .create(RetrofiTinterface.class);
,而不是在外面。同样在类中添加一个 get() 方法,用于检索 Retrofit 实例,并在需要时从外部调用 new RetrofitBuilder(getApplicationContext())
之类的类。
以上是大佬教程为你收集整理的按转换按钮(带 API)使货币转换器应用程序崩溃全部内容,希望文章能够帮你解决按转换按钮(带 API)使货币转换器应用程序崩溃所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。