RookieStudent Ответов: 1

Как использовать фрагменты?


Привет, так что в настоящее время я пытаюсь создать приложение для конвертации валют, ссылаясь на то, что делали другие люди, например, на пример здесь
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

Если вы спрашиваете, нужно ли дублировать код между ними, то ответ будет отрицательным.

1 Ответов

Рейтинг:
2

Richard MacCutchan

55      public void onClick(View v) {
56          btnConvert.setOnClickListener(new View.OnClickListener() {
57              @Override

Вы еще не объявили btnConvert везде, где я могу видеть, или подключил его к визуальному компоненту.


RookieStudent

прости! но вот оно


<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
="" атрибутов xmlns:инструменты="http://schemas.android.com/tools" для android:layout_width="присваиваем" для android:layout_height="присваиваем" инструменты:контекст=".HomeFragment"&ГТ;


&ЛТ;графическое представление
android:id="@+id/cashimage"
="" для android:layout_width="100dp" для android:layout_height="100dp" для Android:layout_alignend="@+ID в кнопку" для Андроид:layout_alignright="@+ID в кнопку" для Андроид:layout_alignparenttop="правда" для Android:layout_gravity="center_horizontal" для Android:layout_margintop="20dp" для Android:layout_marginend="-45dp" для Android:layout_marginright="-45dp" для Android можно здесь:src="@холст/валюте"и GT;

<textview
android:id="@+id/textView5"
="" для android:layout_width="wrap_content в качестве параметров" в android:layout_height="wrap_content в качестве параметров" андроид:layout_alignstart="@+ID и/textView4" для Android:layout_alignparenttop="правда" для Android:layout_marginstart="0dp хиллингдон" для Android:layout_margintop="231dp" андроид:текст="валюта"и GT;

<спиннер
android:id="@+id/planets_spinner"
="" android:layout_width="220dp" android:layout_height="wrap_content" android:layout_aligntop="@+id/textView5" android:layout_marginleft="70dp" android:layout_margintop="1dp">

<textview
android:id="@+id/textView4"
="" для android:layout_width="wrap_content в качестве параметров" в android:layout_height="wrap_content в качестве параметров" андроид:layout_alignparentstart="правда" для Android:layout_alignparentleft="правда" для Android:layout_alignparenttop="правда" для Android:layout_marginstart="41dp" для Android:layout_marginleft="41dp" для Android:layout_margintop="164dp" андроид:текст="сумма"и GT;

<edittext
android:id="@+id/editText4"
="" для android:layout_width="wrap_content в качестве параметров" в android:layout_height="wrap_content в качестве параметров" андроид:layout_alignbottom="@+ID и/textView4" для Android:layout_centerhorizontal="правда" для Android:layout_marginbottom="-16dp" для Android:ЭМС="10" андроид:помощью свойства inputType="число"&ГТ;


кнопка <
андроид:идентификатор="@+ID пользователя/кнопка"
="" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentstart="true" android:layout_alignparentleft="true" android:layout_alignparenttop="true" android:layout_marginstart="125dp" android:layout_marginleft="125dp" android:layout_margintop="297dp" android:text="Convert">

<textview
android:id="@+id/textView6"
="" для android:layout_width="wrap_content в качестве параметров" в android:layout_height="wrap_content в качестве параметров" андроид:layout_alignparentstart="правда" для Android:layout_alignparentleft="правда" для Android:layout_alignparentbottom="правда" для Android:layout_marginstart="51dp" для Android:layout_marginleft="51dp" для Android:layout_marginbottom="113dp" андроид:текст="значение"&ГТ;

<textview
android:id="@+id/textView7"
="" для android:layout_width="wrap_content в качестве параметров" в android:layout_height="wrap_content в качестве параметров" андроид:layout_aligntop="@+ID и/textView6" для Android:layout_marginstart="44dp" для Android:layout_margintop="0dp хиллингдон" для Android:layout_toendof="@+ID и/textView5" андроид:текст="текстовое представление"и GT;

Richard MacCutchan

Очень интересно но где же это btnConvert?

Richard MacCutchan

Глядя на исходный код, кажется, что вы пропустили ту часть, где кнопка инициализируется. Я предлагаю вам вернуться к исходному коду и скопировать его более тщательно.

RookieStudent

привет, но после повторной попытки я все еще сталкиваюсь с той же ошибкой. Имеет ли это какое-либо отношение к тому факту, что я не поместил набор кодов, как показано выше, в класс java, для которого я создал макет ? извините, если мой вопрос кажется здесь плохо сформулированным

Richard MacCutchan

Вы должны подключить btnConvert ссылка на фактический объект в представлении во время выполнения. Если вы не разбираетесь в основах процессов Android, то здесь, на CodeProject, а также на специализированных сайтах разработчиков Android есть множество учебных пособий и примеров.