Skip to content

Commit 5d9b486

Browse files
committed
NOS+Bible: Fix some more tablet layout issues
1 parent b2c1534 commit 5d9b486

File tree

10 files changed

+103
-67
lines changed

10 files changed

+103
-67
lines changed

bin/nos/res/layout/activity_main.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,19 @@
2020
android:inAnimation="@anim/fade_in"
2121
style="@style/Flex">
2222

23-
<ListView android:id="@+id/main_latest_articles_list"
23+
<GridView android:id="@+id/main_latest_articles_list"
2424
style="@style/ArticleList" />
2525

26-
<ListView android:id="@+id/main_economy_articles_list"
26+
<GridView android:id="@+id/main_economy_articles_list"
2727
style="@style/ArticleList" />
2828

29-
<ListView android:id="@+id/main_politics_articles_list"
29+
<GridView android:id="@+id/main_politics_articles_list"
3030
style="@style/ArticleList" />
3131

32-
<ListView android:id="@+id/main_tech_articles_list"
32+
<GridView android:id="@+id/main_tech_articles_list"
3333
style="@style/ArticleList" />
3434

35-
<ListView android:id="@+id/main_sports_articles_list"
35+
<GridView android:id="@+id/main_sports_articles_list"
3636
style="@style/ArticleList" />
3737
</ViewFlipper>
3838

bin/nos/res/layout/item_article.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
33
style="@style/ArticleItem">
44

5-
<ImageView android:id="@+id/article_item_image"
5+
<nl.plaatsoft.nos.android.views.AspectRatioImageView
6+
android:id="@+id/article_item_image"
67
style="@style/ArticleItemImage" />
78

89
<TextView android:id="@+id/article_item_title_label"

bin/nos/res/values-sw600dp/styles.xml

Lines changed: 0 additions & 30 deletions
This file was deleted.
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<!-- Containers -->
4+
<style name="Container" parent="Fill">
5+
<item name="android:layout_width">600dp</item>
6+
<item name="android:layout_gravity">center_horizontal</item>
7+
</style>
8+
9+
<!-- Bottom Bar -->
10+
<style name="BottomBarItem">
11+
<item name="android:layout_width">0dp</item>
12+
<item name="android:layout_height">56dp</item>
13+
<item name="android:layout_weight">1</item>
14+
<item name="android:orientation">horizontal</item>
15+
<item name="android:gravity">center</item>
16+
</style>
17+
18+
<style name="BottomBarItemIcon">
19+
<item name="android:layout_width">24dp</item>
20+
<item name="android:layout_height">24dp</item>
21+
<item name="android:layout_marginRight">8dp</item>
22+
</style>
23+
24+
<style name="BottomBarItemLabel">
25+
<item name="android:layout_width">wrap_content</item>
26+
<item name="android:layout_height">wrap_content</item>
27+
<item name="android:singleLine">true</item>
28+
<item name="android:ellipsize">end</item>
29+
</style>
30+
31+
<!-- Article item -->
32+
<style name="ArticleItem">
33+
<item name="android:layout_width">match_parent</item>
34+
<item name="android:layout_height">wrap_content</item>
35+
<item name="android:orientation">vertical</item>
36+
<item name="android:paddingTop">8dp</item>
37+
<item name="android:paddingBottom">8dp</item>
38+
<item name="android:paddingLeft">16dp</item>
39+
<item name="android:paddingRight">16dp</item>
40+
</style>
41+
42+
<style name="ArticleItemImage">
43+
<item name="android:layout_width">match_parent</item>
44+
<item name="android:layout_height">wrap_content</item>
45+
<item name="android:layout_marginBottom">8dp</item>
46+
<item name="android:background">@color/loading_color</item>
47+
<item name="android:scaleType">centerCrop</item>
48+
<item name="aspectRatio">1.78</item>
49+
</style>
50+
51+
<style name="ArticleItemTitle">
52+
<item name="android:layout_width">match_parent</item>
53+
<item name="android:layout_height">wrap_content</item>
54+
<item name="android:layout_marginBottom">8dp</item>
55+
<item name="android:minLines">2</item>
56+
<item name="android:maxLines">2</item>
57+
<item name="android:ellipsize">end</item>
58+
</style>
59+
</resources>

bin/nos/res/values/styles.xml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
<style name="ArticleItem">
155155
<item name="android:layout_width">match_parent</item>
156156
<item name="android:layout_height">wrap_content</item>
157+
<item name="android:orientation">horizontal</item>
157158
<item name="android:paddingTop">8dp</item>
158159
<item name="android:paddingBottom">8dp</item>
159160
<item name="android:paddingLeft">16dp</item>
@@ -162,10 +163,11 @@
162163

163164
<style name="ArticleItemImage">
164165
<item name="android:layout_width">120dp</item>
165-
<item name="android:layout_height">65dp</item>
166+
<item name="android:layout_height">wrap_content</item>
166167
<item name="android:layout_marginRight">16dp</item>
167168
<item name="android:background">@color/loading_color</item>
168169
<item name="android:scaleType">centerCrop</item>
170+
<item name="aspectRatio">1.78</item>
169171
</style>
170172

171173
<style name="ArticleItemTitle">
@@ -179,7 +181,7 @@
179181

180182
<!-- Article activity -->
181183
<style name="ArticleActivityImage">
182-
<item name="android:layout_width">match_parent</item>
184+
<item name="android:layout_width">wrap_content</item>
183185
<item name="android:layout_height">wrap_content</item>
184186
<item name="aspectRatio">1.78</item>
185187
<item name="android:scaleType">centerCrop</item>

bin/nos/src/nl/plaatsoft/nos/android/activities/MainActivity.java

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@
2424
import android.view.View;
2525
import android.widget.AdapterView;
2626
import android.widget.Button;
27+
import android.widget.GridView;
2728
import android.widget.ImageButton;
2829
import android.widget.ImageView;
2930
import android.widget.LinearLayout;
30-
import android.widget.ListView;
3131
import android.widget.PopupMenu;
3232
import android.widget.TextView;
3333
import android.widget.ViewFlipper;
@@ -43,7 +43,7 @@
4343
import org.json.JSONObject;
4444

4545
public class MainActivity extends BaseActivity implements PopupMenu.OnMenuItemClickListener {
46-
private static record Tab(String url, String title, ListView listView, LinearLayout button) {}
46+
private static record Tab(String url, String title, GridView groupView, LinearLayout button) {}
4747

4848
private static final int SETTINGS_REQUEST_CODE = 1;
4949

@@ -66,7 +66,7 @@ public void onCreate(Bundle savedInstanceState) {
6666

6767
findViewById(R.id.main_refresh_button).setOnClickListener(view -> {
6868
for (var tab : tabs) {
69-
var articlesAdapter = (ArticlesAdapter)tab.listView.getAdapter();
69+
var articlesAdapter = (ArticlesAdapter)tab.groupView.getAdapter();
7070
fetchNewsData(tab.url, false, articlesAdapter);
7171
}
7272
});
@@ -81,25 +81,23 @@ public void onCreate(Bundle savedInstanceState) {
8181
// Init tabs
8282
tabs = new ArrayList<>();
8383
tabs.add(new Tab("https://feeds.nos.nl/nosnieuwsalgemeen", getString(R.string.main_latest_title),
84-
(ListView)findViewById(R.id.main_latest_articles_list),
85-
(LinearLayout)findViewById(R.id.main_latest_button)));
84+
findViewById(R.id.main_latest_articles_list), findViewById(R.id.main_latest_button)));
8685
tabs.add(new Tab("https://feeds.nos.nl/nosnieuwseconomie", getString(R.string.main_economy_title),
87-
(ListView)findViewById(R.id.main_economy_articles_list),
88-
(LinearLayout)findViewById(R.id.main_economy_button)));
86+
findViewById(R.id.main_economy_articles_list), findViewById(R.id.main_economy_button)));
8987
tabs.add(new Tab("https://feeds.nos.nl/nosnieuwspolitiek", getString(R.string.main_politics_title),
90-
(ListView)findViewById(R.id.main_politics_articles_list),
91-
(LinearLayout)findViewById(R.id.main_politics_button)));
88+
findViewById(R.id.main_politics_articles_list), findViewById(R.id.main_politics_button)));
9289
tabs.add(new Tab("https://feeds.nos.nl/nosnieuwstech", getString(R.string.main_tech_title),
93-
(ListView)findViewById(R.id.main_tech_articles_list), (LinearLayout)findViewById(R.id.main_tech_button)));
90+
findViewById(R.id.main_tech_articles_list), findViewById(R.id.main_tech_button)));
9491
tabs.add(new Tab("https://feeds.nos.nl/nossportalgemeen", getString(R.string.main_sports_title),
95-
(ListView)findViewById(R.id.main_sports_articles_list),
96-
(LinearLayout)findViewById(R.id.main_sports_button)));
92+
findViewById(R.id.main_sports_articles_list), findViewById(R.id.main_sports_button)));
9793

9894
for (var i = 0; i < tabs.size(); i++) {
9995
var tab = tabs.get(i);
10096
var articlesAdapter = new ArticlesAdapter(this);
101-
tab.listView.setAdapter(articlesAdapter);
102-
tab.listView.setOnItemClickListener((AdapterView<?> parent, View view, int position, long id) -> {
97+
var display = getResources().getDisplayMetrics();
98+
tab.groupView.setNumColumns(Math.min(Math.max(1, display.widthPixels / (int)(240 * display.density)), 4));
99+
tab.groupView.setAdapter(articlesAdapter);
100+
tab.groupView.setOnItemClickListener((AdapterView<?> parent, View view, int position, long id) -> {
103101
var intent = new Intent(this, ArticleActivity.class);
104102
intent.putExtra("article", articlesAdapter.getItem(position));
105103
startActivity(intent);
@@ -143,26 +141,28 @@ public void onActivityResult(int requestCode, int resultCode, @SuppressWarnings(
143141
@Override
144142
public void onSaveInstanceState(Bundle savedInstanceState) {
145143
super.onSaveInstanceState(savedInstanceState);
144+
146145
var openTabIndex = viewFlipper.getDisplayedChild();
147146
savedInstanceState.putInt("openTab", openTabIndex);
148-
var currentListView = tabs.get(openTabIndex).listView;
149-
var firstChild = currentListView.getChildAt(0);
150-
var offset = (firstChild == null) ? 0 : firstChild.getTop() - currentListView.getPaddingTop();
151-
savedInstanceState.putInt("listScrollIndex", currentListView.getFirstVisiblePosition());
147+
148+
var currentGroupView = tabs.get(openTabIndex).groupView;
149+
var firstChild = currentGroupView.getChildAt(0);
150+
var offset = (firstChild == null) ? 0 : firstChild.getTop() - currentGroupView.getPaddingTop();
151+
savedInstanceState.putInt("listScrollIndex", currentGroupView.getFirstVisiblePosition());
152152
savedInstanceState.putInt("listScrollOffset", offset);
153153
}
154154

155155
@Override
156156
public void onRestoreInstanceState(Bundle savedInstanceState) {
157157
super.onRestoreInstanceState(savedInstanceState);
158+
158159
var openTabIndex = savedInstanceState.getInt("openTab");
159160
openTab(openTabIndex, false);
160-
handler.post(() -> {
161-
var currentListView = tabs.get(openTabIndex).listView;
162-
int index = savedInstanceState.getInt("listScrollIndex");
163-
int offset = savedInstanceState.getInt("listScrollOffset");
164-
currentListView.setSelectionFromTop(index, offset);
165-
});
161+
162+
var currentGroupView = tabs.get(openTabIndex).groupView;
163+
int index = savedInstanceState.getInt("listScrollIndex", 0);
164+
int offset = savedInstanceState.getInt("listScrollOffset", 0);
165+
handler.post(() -> currentGroupView.setSelectionFromTop(index, offset));
166166
}
167167

168168
@Override

bin/nos/src/nl/plaatsoft/nos/android/views/ArticlesAdapter.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ public View getView(int position, View convertView, ViewGroup parent) {
4141
viewHolder = (ViewHolder)convertView.getTag();
4242
}
4343

44+
if (position < 0 || position >= getCount()) {
45+
return convertView;
46+
}
4447
var article = getItem(position);
4548
FetchImageTask.with(getContext())
4649
.load(article.imageUrl())

bin/nos/src/nl/plaatsoft/nos/android/views/AspectRatioImageView.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,12 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
4545
int width;
4646
int height;
4747

48-
if (widthMode == MeasureSpec.EXACTLY) {
48+
// If width is EXACTLY and not MATCH_PARENT (i.e., set in dp), don't use aspect ratio
49+
if (widthMode == MeasureSpec.EXACTLY && getLayoutParams() != null && getLayoutParams().width > 0) {
4950
width = originalWidth;
50-
height = (int)(width / aspectRatio);
51-
if (heightMode == MeasureSpec.EXACTLY && height > MeasureSpec.getSize(heightMeasureSpec)) {
52-
height = MeasureSpec.getSize(heightMeasureSpec);
53-
width = (int)(height * aspectRatio);
51+
height = MeasureSpec.getSize(heightMeasureSpec);
52+
if (heightMode != MeasureSpec.EXACTLY) {
53+
height = (int)(width / aspectRatio);
5454
}
5555
} else if (heightMode == MeasureSpec.EXACTLY) {
5656
height = MeasureSpec.getSize(heightMeasureSpec);

bin/redsquare/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
android:icon="@mipmap/ic_launcher"
1111
android:theme="@style/Theme.App"
1212
android:isGame="true"
13+
android:appCategory="game"
1314
android:enableOnBackInvokedCallback="true">
1415

1516
<activity android:name=".activities.MainActivity"

0 commit comments

Comments
 (0)