Как использовать фрагменты?
Привет, так что в настоящее время я пытаюсь создать приложение для конвертации валют, ссылаясь на то, что делали другие люди, например, на пример здесь
android-studio-with-the-use-of-api-38d07e8253fc">https://medium.com/@kanchanaj/how-to-create-a-simple-currency-converter-app-in-android-studio-with-the-use-of-api-38d07e8253fc[^]
но проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не уверен в части MainActivity относительно того, где и как я должен размещать код для MainActivity, как показано в ссылке. Должен ли я поместить его в MainActivity, как показано в ссылке выше, или я должен поместить его внутри фрагмента, который я создал? и если да, то как его поместить внутрь фрагмента? Вот пример моего фрагмента
1 package sg.edu.rp.c346.new4thappcurrencyconvertorpd; 2 3 4 import android.os.Bundle; 5 6 import androidx.fragment.app.Fragment; 7 8 import android.util.Log; 9 import android.view.LayoutInflater; 10 import android.view.View; 11 import android.view.ViewGroup; 12 import android.widget.ArrayAdapter; 13 import android.widget.Spinner; 14 import android.widget.TextView; 15 import android.widget.Toast; 16 17 import com.squareup.okhttp.Callback; 18 import com.squareup.okhttp.OkHttpClient; 19 import com.squareup.okhttp.Request; 20 import com.squareup.okhttp.Response; 21 22 import org.json.JSONException; 23 import org.json.JSONObject; 24 25 import java.io.IOException; 26 import java.text.BreakIterator; 27 import java.util.ArrayList; 28 import java.util.Iterator; 29 import java.util.List; 30 31 32 /** 33 * A simple {@link Fragment} subclass. 34 */ 35 public class HomeFragment extends Fragment implements View.OnClickListener{ 36 public static BreakIterator data; 37 List<String> keysList; 38 Spinner toCurrency; 39 TextView textView; 40 41 42 public HomeFragment() { 43 // Required empty public constructor 44 } 45 46 47 @Override 48 public View onCreateView(LayoutInflater inflater, ViewGroup container, 49 Bundle savedInstanceState) { 50 // Inflate the layout for this fragment 51 return inflater.inflate(R.layout.fragment_home, container, false); 52 } 53 54 @Override 55 public void onClick(View v) { 56 btnConvert.setOnClickListener(new View.OnClickListener() { 57 @Override 58 public void onClick(View v) { 59 if(!edtEuroValue.getText().toString().isEmpty()) 60 { 61 String toCurr = toCurrency.getSelectedItem().toString(); 62 double euroVlaue = Double.valueOf(edtEuroValue.getText().toString()); 63 64 Toast.makeText(MainActivity.this, "Please Wait..", Toast.LENGTH_SHORT).show(); 65 try { 66 convertCurrency(toCurr, euroVlaue); 67 } catch (IOException e) { 68 e.printStackTrace(); 69 Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show(); 70 } 71 } 72 else 73 { 74 Toast.makeText(MainActivity.this, "Please Enter a Value to Convert..", Toast.LENGTH_SHORT).show(); 75 } 76 77 } 78 }); 79 80 } 81 82 public void loadConvTypes() throws IOException { 83 84 String url = "https://api.exchangeratesapi.io/latest"; 85 86 OkHttpClient client = new OkHttpClient(); 87 88 Request request = new Request.Builder() 89 .url(url) 90 .header("Content-Type", "application/json") 91 .build(); 92 93 94 95 client.newCall(request).enqueue(new Callback() { 96 @Override 97 public void onFailure(Request request, IOException e) { 98 String mMessage = e.getMessage().toString(); 99 Log.w("failure Response", mMessage); 100 Toast.makeText(MainActivity.this, mMessage, Toast.LENGTH_SHORT).show(); 101 } 102 103 @Override 104 public void onResponse(Response response) throws IOException { 105 final String mMessage = response.body().string(); 106 107 108 MainActivity.this.runOnUiThread(new Runnable() { 109 @Override 110 public void run() { 111 //Toast.makeText(MainActivity.this, mMessage, Toast.LENGTH_SHORT).show(); 112 try { 113 JSONObject obj = new JSONObject(mMessage); 114 JSONObject b = obj.getJSONObject("rates"); 115 116 Iterator keysToCopyIterator = b.keys(); 117 keysList = new ArrayList<String>(); 118 119 while(keysToCopyIterator.hasNext()) { 120 121 String key = (String) keysToCopyIterator.next(); 122 123 keysList.add(key); 124 125 } 126 127 128 ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, keysList ); 129 toCurrency.setAdapter(spinnerArrayAdapter); 130 131 132 133 134 135 } catch (JSONException e) { 136 e.printStackTrace(); 137 } 138 139 } 140 }); 141 } 142 143 144 145 146 }); 147 } 148 149 public void convertCurrency(final String toCurr, final double euroVlaue) throws IOException { 150 151 String url = "https://api.exchangeratesapi.io/latest"; 152 153 OkHttpClient client = new OkHttpClient(); 154 155 Request request = new Request.Builder() 156 .url(url) 157 .header("Content-Type", "application/json") 158 .build(); 159 160 161 162 client.newCall(request).enqueue(new Callback() { 163 @Override 164 public void onFailure(Request request, IOException e) { 165 String mMessage = e.getMessage().toString(); 166 Log.w("failure Response", mMessage); 167 Toast.makeText(HomeFragment.this, mMessage, Toast.LENGTH_SHORT).show(); 168 } 169 170 @Override 171 public void onResponse(Response response) throws IOException { 172 final String mMessage = response.body().string(); 173 HomeFragment.this.runOnUiThread(new Runnable() { 174 @Override 175 public void run() { 176 //Toast.makeText(MainActivity.this, mMessage, Toast.LENGTH_SHORT).show(); 177 try { 178 JSONObject obj = new JSONObject(mMessage); 179 JSONObject b = obj.getJSONObject("rates"); 180 181 String val = b.getString(toCurr); 182 183 double output = euroVlaue*Double.valueOf(val); 184 185 186 textView.setText(String.valueOf(output)); 187 188 } catch (JSONException e) { 189 e.printStackTrace(); 190 } 191 192 } 193 }); 194 } 195 196 197 198 199 200 }); 201 } 202 }
Что я уже пробовал:
поэтому в настоящее время я попытался следовать инструкциям, приведенным в приведенной выше ссылке, и поместил его в MainActivity сам по себе. но однако я потом подошел к этому вопросу
Process: sg.edu.rp.c346.new4thappcurrencyconvertorpd, PID: 8656 java.lang.RuntimeException: Unable to start activity ComponentInfo{sg.edu.rp.c346.new4thappcurrencyconvertorpd/sg.edu.rp.c346.new4thappcurrencyconvertorpd.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference at sg.edu.rp.c346.new4thappcurrencyconvertorpd.MainActivity.onCreate(MainActivity.java:66) at android.app.Activity.performCreate(Activity.java:7136) at android.app.Activity.performCreate(Activity.java:7127) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Я не очень хорошо знаком с фрагментами и в настоящее время все еще изучаю android здесь, поэтому мои искренние извинения, если мои вопросы кажутся глупыми.
David Crow
Если вы используете Android Studio, вы должны получить ошибку компиляции в/вокруг строки 56, как btnConvert
он не был ни объявлен, ни инициализирован.
В onCreate()
метод, вам, скорее всего, понадобится что-то вроде:
btnConvert = findViewById(R.id.button);
RookieStudent
но у меня это уже было написано, хотя в моей основной деятельности, вот она:
пакет СГ.еду.РП.c346.new4thappcurrencyconvertorpd;
импорт androidx.аннотации.Значение, отличное от null;
импорт androidx.совместимости приложений.приложение.AppCompatActivity;
импорт androidx.fragment.app.Fragment;
импорт androidx.navigation.NavController;
импорт androidx.navigation.Навигация;
импорт androidx.навигация.пользовательского интерфейса.NavigationUI;
импорт android.os.Bundle;
импорт android.util.Log;
импорт android.view.пункт меню;
импорт android.view.View;
импорт android.widget.Адаптер массива;
импорт android.widget.Кнопка;
импорт android.widget.EditText;
импорт android.widget.Волчок;
импорт android.widget.TextView;
импорт android.widget.Тост;
импорт com.google.android.material.bottomnavigation.BottomNavigationView;
импорт com.squareup.okhttp.Обратный звонок;
импорт com.squareup.okhttp.Охттпклиент;
импорт com.squareup.okhttp.Запрос;
импорт com.squareup.okhttp.Response;
импорт орг.в формате JSON.JSONException;
импорт орг.в формате JSON.JSONObject;
импорт Java.Ио.Исключение IOException;
импорт java.text.BreakIterator;
импорт java.util.список ArrayList;
импорт java.util.Итератор;
импорт java.util.List;
public class MainActivity расширяет AppCompatActivity {
публичные статические данные BreakIterator;
Список ключей list<string> ;
ToCurrency счетчик ;
Виджет TextView виджет TextView ;
@Ручная коррекция
protected void onCreate(Bundle savedInstanceState) {
супер.метод onCreate(savedInstanceState);
setContentView(R. layout.activity_main);
NavController navController = Navigation.findNavController(this, R. id.nav_host_fragment);
BottomNavigationView bottomNav = findViewById(R. id.bottom_nav);
bottomNav.setOnNavigationItemSelectedListener(navListener);
NavigationUI.setupWithNavController(bottomNav, navController);
getSupportFragmentManager().beginTransaction().replace(R. id.nav_host_fragment, new HomeFragment());
toCurrency = (Spinner)findViewById(R. id.planets_spinner);
окончательный полей EditText edtEuroValue = (полей EditText)findViewById, чтобы найти(ИД Р..editText4);
окончательный btnConvert кнопка = (кнопка)findViewById, чтобы найти(ИД Р..кнопка);
виджет TextView =(виджет TextView) findViewById, чтобы найти(Р. ИД.textView7);
пробовать {
loadConvTypes();
} catch (IOException e) {
е.печатные();
}
btnConvert.setOnClickListener(новый вид.OnClickListener() {
@Ручная коррекция
общественного недействительными onclick(посмотреть V) {
если(!edtEuroValue.то gettext().метод toString().отсутствуют())
{
Строки toCurr = toCurrency.getSelectedItem().метод toString();
двойной euroVlaue = двойной.метод valueOf(edtEuroValue.то gettext().метод toString());
Toast.makeText(MainActivity.this, "Пожалуйста, подождите..", Toast.LENGTH_SHORT).показать();
пробовать {
конвертируемая валюта(toCurr, euroVlaue);
} catch (IOException e) {
е.печатные();
Тост.makeText(в MainActivity.это, Эл.метод GetMessage(), тост.LENGTH_SHORT).показать();
}
}
еще
{
Toast.makeText(MainActivity.this, "пожалуйста, введите значение для преобразования..", Toast.LENGTH_SHORT).показать();
}
}
});
}
public void loadConvTypes() выбрасывает исключение IOException {
Строка url = "https://api.exchangeratesapi.io/latest";
Клиент OkHttpClient = новый клиент OkHttpClient();
Запрос запрос = новый запрос.Строитель()
.URL-адрес(URL-адрес)
.header("Content-Type", "application/json")
.строить();
клиент.newCall(запрос).enqueue(новый обратный вызов() {
@Ручная коррекция
public void onFailure(Request request, IOException e) {
Строки mMessage = е.метод GetMessage().метод toString();
Log.w("реакция на отказ",
David Crow
Ваш класс HomeFragment
не имеет такого заявления для btnConvert
. MainActivity
тем не менее,.
Кстати, нет никакой необходимости показывать весь класс. Просто покажите соответствующие части.
RookieStudent
ах, прости меня за это. Но я хотел бы спросить, хотя бы потому, что я не очень хорошо знаком с использованием фрагментов, ибо мой HomeFragment-это код, который должен использоваться так же, как и тот, который применяется к MainActivity? Я приношу свои извинения, если мой вопрос кажется плохо структурированным.
David Crow
"для моего HomeFragment-это код, который должен использоваться так же, как и тот, который применяется к MainActivity?"
Я не понимаю этого вопроса.
RookieStudent
ммм я имел в виду что как должен быть написан код для HomeFragment поскольку я не знаю Нужно ли мне использовать код который находится в MainActivity и применить его к HomeFragment
David Crow
Если вы спрашиваете, нужно ли дублировать код между ними, то ответ будет отрицательным.