diff options
| -rw-r--r-- | app/build.gradle | 4 | ||||
| -rw-r--r-- | app/src/main/java/com/jopek/taupngamoni/ChartFragment.java | 207 | ||||
| -rw-r--r-- | app/src/main/java/com/jopek/taupngamoni/Currency.java | 4 | ||||
| -rw-r--r-- | app/src/main/java/com/jopek/taupngamoni/HomeFragment.java | 102 | ||||
| -rw-r--r-- | app/src/main/java/com/jopek/taupngamoni/MainActivity.java | 7 | ||||
| -rw-r--r-- | app/src/main/java/com/jopek/taupngamoni/MySpinnerAdapter.java | 6 | ||||
| -rw-r--r-- | app/src/main/java/com/jopek/taupngamoni/Requests.java | 12 | ||||
| -rw-r--r-- | app/src/main/res/layout/fragment_chart.xml | 16 |
8 files changed, 248 insertions, 110 deletions
diff --git a/app/build.gradle b/app/build.gradle index 7942592..a4ec6e1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_1_9 + targetCompatibility JavaVersion.VERSION_1_9 } buildFeatures { viewBinding true diff --git a/app/src/main/java/com/jopek/taupngamoni/ChartFragment.java b/app/src/main/java/com/jopek/taupngamoni/ChartFragment.java index ce9bfa4..2c0999b 100644 --- a/app/src/main/java/com/jopek/taupngamoni/ChartFragment.java +++ b/app/src/main/java/com/jopek/taupngamoni/ChartFragment.java @@ -1,12 +1,20 @@ package com.jopek.taupngamoni; +import static com.jopek.taupngamoni.Currency.CURRENCIES; + import android.os.Bundle; +import android.os.Looper; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.Spinner; +import android.widget.TextView; import androidx.fragment.app.Fragment; +import com.anychart.APIlib; import com.anychart.AnyChart; import com.anychart.AnyChartView; import com.anychart.chart.common.dataentry.DataEntry; @@ -15,12 +23,16 @@ import com.anychart.charts.Cartesian; import com.anychart.core.cartesian.series.BaseWithMarkers; import com.anychart.data.Mapping; import com.anychart.data.Set; -import com.anychart.enums.Anchor; -import com.anychart.enums.MarkerType; import com.anychart.enums.TooltipPositionMode; import com.anychart.graphics.vector.Stroke; +import org.json.JSONException; +import org.json.JSONObject; + +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; /** @@ -30,20 +42,25 @@ import java.util.List; */ public class ChartFragment extends Fragment { - // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private static final String ARG_PARAM1 = "param1"; private static final String ARG_PARAM2 = "param2"; - // TODO: Rename and change types of parameters private String mParam1; private String mParam2; - private AnyChartView anyChartView; private Cartesian cartesian; private boolean columnChart = true; private List<DataEntry> seriesData = new ArrayList<>(); - private BaseWithMarkers series; + private Currency curFrom = CURRENCIES.get(0); + private Currency curTo = CURRENCIES.get(0); + private long chartTime = 7; + private char chartTimeF = 'd'; + private AnyChartView anyChartView; + private int checkFrom = 0; + private int checkTo = 0; + private MySpinnerAdapter spinnerFromAdapter; + private MySpinnerAdapter spinnerToAdapter; public ChartFragment() { // Required empty public constructor @@ -70,6 +87,7 @@ public class ChartFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); @@ -77,32 +95,30 @@ public class ChartFragment extends Fragment { } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_chart, container, false); + Log.d("maks", "onCreateView: " + anyChartView + curFrom.code); + initializeSpinners(view); +// if (anyChartView == null) { anyChartView = view.findViewById(R.id.any_chart_view); anyChartView.setProgressBar(view.findViewById(R.id.progress_bar)); - + APIlib.getInstance().setActiveAnyChartView(anyChartView); + anyChartView.resetPivot(); +// if (cartesian != null) cartesian.removeAllSeries(); cartesian = AnyChart.line(); + cartesian.removeAllSeries(); cartesian.animation(true); cartesian.padding(10d, 20d, 5d, 20d); cartesian.crosshair().enabled(true); - cartesian.crosshair() - .yLabel(true) - .yStroke((Stroke) null, null, null, (String) null, (String) null); + cartesian.crosshair().yLabel(true).yStroke((Stroke) null, null, null, (String) null, (String) null); cartesian.tooltip().positionMode(TooltipPositionMode.POINT); - - seriesData = new ArrayList<>(); - seriesData.add(new CustomDataEntry("1986", 3.6)); - seriesData.add(new CustomDataEntry("1987", 7.1)); - seriesData.add(new CustomDataEntry("1988", 8.5)); - seriesData.add(new CustomDataEntry("1989", 9.2)); - seriesData.add(new CustomDataEntry("1990", 10.1)); - - refreshChart(); anyChartView.setChart(cartesian); +// } + checkFrom = 0; + checkTo = 0; + refreshChart(); // cartesian.title("Trend of Sales of the Most Popular Products of ACME Corp."); @@ -110,61 +126,160 @@ public class ChartFragment extends Fragment { // cartesian.xAxis(0).labels().padding(5d, 5d, 5d, 5d); - view.findViewById(R.id.b1d).setOnClickListener(v -> onBtnClick("1d")); + view.findViewById(R.id.b1d).setOnClickListener(v -> onBtnClick("9m")); view.findViewById(R.id.b7d).setOnClickListener(v -> onBtnClick("7d")); view.findViewById(R.id.b1m).setOnClickListener(v -> onBtnClick("1m")); view.findViewById(R.id.b3m).setOnClickListener(v -> onBtnClick("3m")); view.findViewById(R.id.b6m).setOnClickListener(v -> onBtnClick("6m")); view.findViewById(R.id.b1y).setOnClickListener(v -> onBtnClick("1y")); - view.findViewById(R.id.btn_change_chart_type).setOnClickListener(v -> { + TextView btn = view.findViewById(R.id.btn_change_chart_type); + btn.setOnClickListener(v -> { columnChart = !columnChart; + Log.d("maks", "onCreateView: "); refreshChart(); }); + anyChartView.setVisibility(View.INVISIBLE); + new android.os.Handler(Looper.getMainLooper()).postDelayed( + () -> { + anyChartView.setVisibility(View.VISIBLE); + refreshChart(); + }, + 1500); + return view; } public void refreshChart() { - cartesian.removeAllSeries(); + ZonedDateTime nowO = ZonedDateTime.now(); + String now = nowO.format(DateTimeFormatter.ISO_LOCAL_DATE); + ZonedDateTime pastO = ZonedDateTime.now(); + if (chartTimeF == 'd') pastO = pastO.minusDays(chartTime); + else if (chartTimeF == 'm') pastO = pastO.minusMonths(chartTime); + else if (chartTimeF == 'y') pastO = pastO.minusYears(chartTime); + + String past = pastO.format(DateTimeFormatter.ISO_LOCAL_DATE); + Log.d("maks", "refreshChart: " + curFrom.code); + String url = "https://api.exchangerate.host/timeseries?base=" + curFrom.code + "&symbols=" + curTo.code + "&start_date=" + past + "&end_date=" + now; + Log.d("maks", "refreshChart: " + url); + + Requests requests = new Requests(); + requests.getJson(url, json -> { + Log.d("maks", "refreshChart: " + json); + try { + JSONObject rates = json.getJSONObject("rates"); + seriesData = new ArrayList<>(); + for (Iterator<String> it = rates.keys(); it.hasNext(); ) { + String key = it.next(); + JSONObject rate = rates.getJSONObject(key); + seriesData.add(new CustomDataEntry(key, rate.getDouble(rate.keys().next()))); + } + redrawChart(); + } catch (JSONException e) { + e.printStackTrace(); + } + }); + } + + public void redrawChart() { + if (cartesian.getSeriesAt(0) != null) cartesian.removeAllSeries(); + + Log.d("maks", "redrawChart: " + seriesData); Set set = Set.instantiate(); set.data(seriesData); Mapping seriesMapping = set.mapAs("{ x: 'x', value: 'value' }"); - if (columnChart) - series = cartesian.column(seriesMapping); - else - series = cartesian.line(seriesMapping); + BaseWithMarkers series; + if (columnChart) series = cartesian.column(seriesMapping); + else series = cartesian.line(seriesMapping); +// series.hovered().markers() +// .enabled(true) +// .type(MarkerType.CIRCLE) +// .size(4d); +// series.tooltip() +// .position("right") +// .anchor(Anchor.LEFT_CENTER) +// .offsetX(5d) +// .offsetY(5d); +// Log.d("maks", "redrawChart: " + seriesMapping.getJsBase()); series.data(seriesMapping); // series.name("Brandy"); - series.hovered().markers() - .enabled(true) - .type(MarkerType.CIRCLE) - .size(4d); - series.tooltip() - .position("right") - .anchor(Anchor.LEFT_CENTER) - .offsetX(5d) - .offsetY(5d); - cartesian.legend().enabled(true) - .fontSize(13d) - .padding(0d, 0d, 10d, 0d); +// cartesian.legend().enabled(true) +// .fontSize(13d) +// .padding(0d, 0d, 10d, 0d); } public void onBtnClick(String time) { - seriesData = new ArrayList<>(); - seriesData.add(new CustomDataEntry("1982", 8.5)); - seriesData.add(new CustomDataEntry("1992", 7.1)); - seriesData.add(new CustomDataEntry("1992", 10.1)); - seriesData.add(new CustomDataEntry("1992", 9.2)); - seriesData.add(new CustomDataEntry("1992", 3.6)); + chartTime = Character.getNumericValue(time.charAt(0)); + chartTimeF = time.charAt(1); + Log.d("maks", "onBtnClick: "); refreshChart(); } + public void initializeSpinners(View view) { + Spinner cur_from = view.findViewById(R.id.cur_from); + Spinner cur_to = view.findViewById(R.id.cur_to); + if (spinnerFromAdapter == null) + spinnerFromAdapter = new MySpinnerAdapter(requireContext(), CURRENCIES); + cur_from.setAdapter(spinnerFromAdapter); + + if (spinnerToAdapter == null) + spinnerToAdapter = new MySpinnerAdapter(requireContext(), CURRENCIES); + cur_to.setAdapter(spinnerToAdapter); + + cur_from.setSelection(1); + cur_from.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { + Log.d("maks", "onItemSelected: " + checkFrom); + String oldCode = curFrom.code; + curFrom = CURRENCIES.get(position); + if (++checkFrom < 2 || oldCode.equals(curFrom.code)) return; + if (curTo != null) { + refreshChart(); + } + } + + @Override + public void onNothingSelected(AdapterView<?> parent) { + } + }); + cur_to.setSelection(0); + cur_to.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { + String oldCode = curTo.code; + curTo = CURRENCIES.get(position); + Log.d("maks", "onItemSelected: " + checkTo + curTo.code); + if (++checkTo < 2 || oldCode.equals(curTo.code)) return; + if (curFrom != null) { + refreshChart(); + } + } + + @Override + public void onNothingSelected(AdapterView<?> parent) { + } + }); + } + +// @Override +// public void onDestroyView() { +// super.onDestroyView(); +// Log.d("maks", "onDestroyView: "); +// anyChartView.clear(); +// anyChartView.resetPivot(); +// cartesian.removeAllSeries(); +// seriesData.clear(); +// cartesian.column(seriesData); +// } + + private class CustomDataEntry extends ValueDataEntry { CustomDataEntry(String x, Number value) { super(x, value); diff --git a/app/src/main/java/com/jopek/taupngamoni/Currency.java b/app/src/main/java/com/jopek/taupngamoni/Currency.java index 3eb40d2..b43e544 100644 --- a/app/src/main/java/com/jopek/taupngamoni/Currency.java +++ b/app/src/main/java/com/jopek/taupngamoni/Currency.java @@ -2,6 +2,8 @@ package com.jopek.taupngamoni; import android.graphics.Bitmap; +import java.util.List; + public class Currency { public String code; public String description; @@ -20,6 +22,8 @@ public class Currency { public static final Currency CZK = new Currency("CZK", "Czech Republic Koruna", null, "Kč", 0.0); public static final Currency TWD = new Currency("TWD", "New Taiwan Dollar", null, "圓", 0.0); + public static final List<Currency> CURRENCIES = List.of(USD, GBP, CHF, PLN, EUR, JPY, CNY, UAH, CZK, TWD); + public Currency(String code, String description, Bitmap img, String symbol, double conversionFactor) { this.code = code; this.description = description; diff --git a/app/src/main/java/com/jopek/taupngamoni/HomeFragment.java b/app/src/main/java/com/jopek/taupngamoni/HomeFragment.java index 89738fa..770b8b1 100644 --- a/app/src/main/java/com/jopek/taupngamoni/HomeFragment.java +++ b/app/src/main/java/com/jopek/taupngamoni/HomeFragment.java @@ -1,5 +1,7 @@ package com.jopek.taupngamoni; +import static com.jopek.taupngamoni.Currency.CURRENCIES; + import android.content.Context; import android.os.Bundle; import android.text.Editable; @@ -12,7 +14,6 @@ import android.widget.AdapterView; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; -import android.widget.Toast; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.GridLayoutManager; @@ -36,17 +37,20 @@ public class HomeFragment extends Fragment implements AdapterView.OnItemSelected // TODO: Customize parameters private int mColumnCount = 1; - private ArrayList<Currency> currencies = new ArrayList<>(); private ArrayList<Currency> selectedCurrencies = new ArrayList<>(); private HomeRecyclerAdapter recyclerAdapter = new HomeRecyclerAdapter(selectedCurrencies, code -> selectedCurrencies.removeIf(cur -> cur.code.equals(code))); private MySpinnerAdapter spinnerAdapter; private Spinner spinner; + private boolean wontSetSpinnerAdapter = false; /** * Mandatory empty constructor for the fragment manager to instantiate the * fragment (e.g. upon screen orientation changes). */ public HomeFragment() { + selectedCurrencies.add(Currency.USD); + selectedCurrencies.add(Currency.GBP); + selectedCurrencies.add(Currency.PLN); } // TODO: Customize parameter initialization @@ -61,36 +65,28 @@ public class HomeFragment extends Fragment implements AdapterView.OnItemSelected @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + spinnerAdapter = new MySpinnerAdapter(requireContext(), CURRENCIES); - currencies.add(Currency.USD); - currencies.add(Currency.GBP); - currencies.add(Currency.CHF); - currencies.add(Currency.PLN); - currencies.add(Currency.EUR); - currencies.add(Currency.JPY); - currencies.add(Currency.CNY); - currencies.add(Currency.UAH); - currencies.add(Currency.CZK); - currencies.add(Currency.TWD); - - selectedCurrencies.add(Currency.USD); - selectedCurrencies.add(Currency.GBP); - selectedCurrencies.add(Currency.PLN); - - for (int i = 0; i < currencies.size(); i++) { - Currency cur = currencies.get(i); + for (int i = 0; i < CURRENCIES.size(); i++) { + Currency cur = CURRENCIES.get(i); RequestImage requestImage = new RequestImage(); int finalI = i; - requestImage.getBitmap("https://wise.com/public-resources/assets/flags/rectangle/" + cur.code.toLowerCase() + ".png", bitmap -> { - cur.img = bitmap; - HomeFragment.conversionTo = Currency.USD; - if (finalI + 1 == currencies.size()) { - spinner.setAdapter(spinnerAdapter); - recyclerAdapter.notifyDataSetChanged(); - } - }); + if (cur.img == null) { + Log.d("maks", "onCreate: requesting image"); + requestImage.getBitmap("https://wise.com/public-resources/assets/flags/rectangle/" + cur.code.toLowerCase() + ".png", bitmap -> { + cur.img = bitmap; + HomeFragment.conversionTo = Currency.USD; + if (finalI + 1 == CURRENCIES.size()) { + spinner.setAdapter(spinnerAdapter); + recyclerAdapter.notifyDataSetChanged(); + } + }); + } else { +// spinner.setAdapter(spinnerAdapter); +// recyclerAdapter.notifyDataSetChanged(); + wontSetSpinnerAdapter = true; + } } - spinnerAdapter = new MySpinnerAdapter(requireContext(), currencies); if (getArguments() != null) { mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT); @@ -102,7 +98,6 @@ public class HomeFragment extends Fragment implements AdapterView.OnItemSelected Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_screen_home_list, container, false); RecyclerView recyclerView = view.findViewById(R.id.list); - Log.d("maks", "onCreateView: " + view + container + recyclerView); spinner = view.findViewById(R.id.spinner); spinner.setOnItemSelectedListener(this); @@ -112,9 +107,11 @@ public class HomeFragment extends Fragment implements AdapterView.OnItemSelected @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } + @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } + @Override public void afterTextChanged(Editable s) { String val = s.toString(); @@ -128,7 +125,7 @@ public class HomeFragment extends Fragment implements AdapterView.OnItemSelected }); TextView btnAdd = view.findViewById(R.id.btn_add); btnAdd.setOnClickListener(v -> { - if(selectedCurrencies.stream().noneMatch(cur -> cur.code.equals(HomeFragment.conversionTo.code))) { + if (selectedCurrencies.stream().noneMatch(cur -> cur.code.equals(HomeFragment.conversionTo.code))) { selectedCurrencies.add(HomeFragment.conversionTo); updateList(); } @@ -141,34 +138,41 @@ public class HomeFragment extends Fragment implements AdapterView.OnItemSelected recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount)); } recyclerView.setAdapter(recyclerAdapter); + + if (wontSetSpinnerAdapter) { + spinner.setAdapter(spinnerAdapter); + recyclerAdapter.notifyDataSetChanged(); + } + return view; } //Performing action onItemSelected and onNothing selected @Override public void onItemSelected(AdapterView<?> arg0, View view, int position, long id) { - Currency selCur = currencies.get(position); + Currency selCur = CURRENCIES.get(position); HomeFragment.conversionTo = selCur; updateList(); } - public void updateList() { - String url = "https://api.exchangerate.host/latest?base=" + HomeFragment.conversionTo.code + "&symbols="; - for (Currency cur : selectedCurrencies) { - url += cur.code + ","; - } - Requests request = new Requests(); - request.getJson(url, json -> { - try { - JSONObject rates = json.getJSONObject("rates"); - for (Currency cur : selectedCurrencies) { - cur.conversionFactor = rates.getDouble(cur.code); - } - } catch (JSONException e) { - e.printStackTrace(); - } - recyclerAdapter.notifyDataSetChanged(); - }); - } + + public void updateList() { + String url = "https://api.exchangerate.host/latest?base=" + HomeFragment.conversionTo.code + "&symbols="; + for (Currency cur : selectedCurrencies) { + url += cur.code + ","; + } + Requests request = new Requests(); + request.getJson(url, json -> { + try { + JSONObject rates = json.getJSONObject("rates"); + for (Currency cur : selectedCurrencies) { + cur.conversionFactor = rates.getDouble(cur.code); + } + } catch (JSONException e) { + e.printStackTrace(); + } + recyclerAdapter.notifyDataSetChanged(); + }); + } @Override public void onNothingSelected(AdapterView<?> arg0) { diff --git a/app/src/main/java/com/jopek/taupngamoni/MainActivity.java b/app/src/main/java/com/jopek/taupngamoni/MainActivity.java index dc33dfe..c4d7e41 100644 --- a/app/src/main/java/com/jopek/taupngamoni/MainActivity.java +++ b/app/src/main/java/com/jopek/taupngamoni/MainActivity.java @@ -6,6 +6,7 @@ import com.google.android.material.bottomnavigation.BottomNavigationView; import android.annotation.SuppressLint; import android.os.Bundle; +import android.os.StrictMode; import android.view.MenuItem; import java.math.RoundingMode; @@ -19,6 +20,12 @@ public class MainActivity extends AppCompatActivity implements BottomNavigationV @Override protected void onCreate(Bundle savedInstanceState) { +// StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() +// .detectLeakedClosableObjects() +// .penaltyLog() +// .build()); + StrictMode.enableDefaults(); + super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); diff --git a/app/src/main/java/com/jopek/taupngamoni/MySpinnerAdapter.java b/app/src/main/java/com/jopek/taupngamoni/MySpinnerAdapter.java index f27c74a..621cf87 100644 --- a/app/src/main/java/com/jopek/taupngamoni/MySpinnerAdapter.java +++ b/app/src/main/java/com/jopek/taupngamoni/MySpinnerAdapter.java @@ -9,14 +9,14 @@ import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; -import java.util.ArrayList; +import java.util.List; public class MySpinnerAdapter extends BaseAdapter { Context context; - ArrayList<Currency> currencies; + List<Currency> currencies; LayoutInflater inflater; - public MySpinnerAdapter(Context applicationContext, ArrayList<Currency> currencies) { + public MySpinnerAdapter(Context applicationContext, List<Currency> currencies) { this.context = applicationContext; this.currencies = currencies; inflater = (LayoutInflater.from(applicationContext)); diff --git a/app/src/main/java/com/jopek/taupngamoni/Requests.java b/app/src/main/java/com/jopek/taupngamoni/Requests.java index 790f8bd..1b696e6 100644 --- a/app/src/main/java/com/jopek/taupngamoni/Requests.java +++ b/app/src/main/java/com/jopek/taupngamoni/Requests.java @@ -36,7 +36,6 @@ class RequestImage extends AsyncTask<String, Void, Bitmap> { Bitmap bmp = null; try { InputStream in = new URL(urldisplay).openStream(); - Log.d("maks", "doInBackground: " + in.available()); bmp = BitmapFactory.decodeStream(in); } catch (Exception e) { e.printStackTrace(); @@ -74,9 +73,10 @@ public class Requests extends AsyncTask<String, Integer, String> { } protected String doInBackground(String... urls) { + InputStream in = null; try { URL url = new URL(urls[0]); - InputStream in = url.openStream(); + in = url.openStream(); // Log.d("maks", "doInBackground: " + in.available()); // bmp = BitmapFactory.decodeStream(in); // HttpURLConnection connection = (HttpURLConnection) url.openConnection(); @@ -91,8 +91,16 @@ public class Requests extends AsyncTask<String, Integer, String> { while ((line = rd.readLine()) != null) { content += line + "\n"; } + in.close(); return content; } catch (IOException exception) { + if(in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } exception.printStackTrace(); return "ERROR"; } diff --git a/app/src/main/res/layout/fragment_chart.xml b/app/src/main/res/layout/fragment_chart.xml index dcf4778..b51cf1f 100644 --- a/app/src/main/res/layout/fragment_chart.xml +++ b/app/src/main/res/layout/fragment_chart.xml @@ -40,14 +40,6 @@ android:orientation="horizontal"> <Button - android:id="@+id/b1d" - style="?android:attr/buttonBarButtonStyle" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_weight="1" - android:text="1D" /> - - <Button android:id="@+id/b7d" style="?android:attr/buttonBarButtonStyle" android:layout_width="match_parent" @@ -80,6 +72,14 @@ android:text="6M" /> <Button + android:id="@+id/b1d" + style="?android:attr/buttonBarButtonStyle" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_weight="1" + android:text="9M" /> + + <Button android:id="@+id/b1y" style="?android:attr/buttonBarButtonStyle" android:layout_width="match_parent" |
