The bottom property of below textView scales wrong, the TextView is on a different height on every Android device: See attached pictures.
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bars_layout);
RelativeLayout relativeLayout = (RelativeLayout)findViewById(R.id.bar_holder);
BarView view = new BarView(getApplicationContext());
int width = (int) getApplicationContext().getResources().getDimension(R.dimen.bar_width_compare);
int height = 200;
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(width, height);
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
int left = (int) getApplicationContext().getResources().getDimension(R.dimen.bar_margin_left_right);
int right = 0;
int bottom = (int) getApplicationContext().getResources().getDimension(R.dimen.graph_margin_bar_compare_bottom);
params.setMargins(left, 0, right, bottom);
view.setBackgroundColor(getApplicationContext().getResources().getColor(R.color.bar_dark_blue));
view.setLayoutParams(params);
relativeLayout.addView(view);
TextView textView = new TextView(getApplicationContext());
textView.setText(" 20 ");
textView.setTextSize(20);
textView.setTextColor(getApplicationContext().getResources().getColor(R.color.black_text));
width = (int) getApplicationContext().getResources().getDimension(R.dimen.bar_width);
height = 100;
bottom = (int) getApplicationContext().getResources().getDimension(R.dimen.graph_margin_bar_bottom);
int offset = getApplicationContext().getResources().getDimensionPixelOffset(R.dimen.graph_margin_bar_bottom);
int pxSize = getApplicationContext().getResources().getDimensionPixelSize(R.dimen.graph_margin_bar_bottom);
RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(width, height);
params2.setMargins(0, 0, 0, bottom);
params2.addRule(Gravity.CENTER_HORIZONTAL);
params2.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
params2.addRule(RelativeLayout.ALIGN_LEFT, view.getId());
textView.setLayoutParams(params2);
relativeLayout.addView(textView);
}
}
bars_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginTop="40dp" >
<RelativeLayout
android:id="@+id/bar_holder"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginTop="20dp"
android:layout_marginBottom="10dp" >
</RelativeLayout>
</LinearLayout>
dimens.xml
<resources>
<dimen name="graph_margin_bar_bottom">40dp</dimen>
<dimen name="bar_width_compare">25dp</dimen>
<dimen name="bar_margin_left_right">10dp</dimen>
<dimen name="graph_margin_bar_compare_bottom">50dp</dimen>
<dimen name="bar_width">50dp</dimen>
</resources>
Here are 2 examples of phones, but it looks different on every phone...
Samsung Galaxy Tab 3 Lite (density1.0)
Samsung Galaxy S4 (density3.0)
setMargins(int,int,int,int) is using pixels, not DIP, so on every device same size in pixels looks different, you need to convert DIP into pixels and then setMargins() with that value