Ahmed Flash Developer Ahmed Flash Developer - 4 months ago 18
Android Question

How can I move the first column on the right side without using gravity property?

At the table I tried to move the red columns from the right side to the left side with the possibility of rotation.

I tried using the

android:gravity="right"
, but it did without results.

How can I move the green column to the far right side and move the other columns to the left without problems.

Here's a screenshot

My layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="right"
android:id="@+id/fillable_area">
<TableLayout
android:gravity="right"
android:id="@+id/table_header"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content">

<LinearLayout android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="right"
>
<TableLayout
android:gravity="right"
android:id="@+id/scrollable_part2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<HorizontalScrollView
android:gravity="left"
android:id="@+id/scroller"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TableLayout
android:gravity="left"
android:id="@+id/scrollable_part"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</HorizontalScrollView>
</LinearLayout>
</ScrollView>
</LinearLayout>


My code:

package com.examp.swap_items;
import java.util.ArrayList;

import android.R.layout;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.HorizontalScrollView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TableRow.LayoutParams;
import android.widget.TextView;
import android.app.Activity;

public class MainActivity extends Activity {
private boolean showSummaries;

private TableLayout summaryTable;
private TableLayout frozenTable;
private TableLayout contentTable;
private Button backButton ;
private HorizontalScrollView hor;
private TextView recyclableTextView;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TableRow.LayoutParams wrapWrapTableRowParams = new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
int[] fixedColumnWidths = new int[]{20, 20,20, 20, 20};
int[] scrollableColumnWidths = new int[]{20, 20, 20, 30, 30};
int fixedRowHeight = 50;
int fixedHeaderHeight = 60;
TableRow row = new TableRow(this);
//header (fixed vertically)
TableLayout header=(TableLayout)findViewById(R.id.table_header);
row.setLayoutParams(wrapWrapTableRowParams);
row.setGravity(Gravity.CENTER);
row.setBackgroundColor(Color.WHITE);
row.addView(makeTableRowWithText("col1", fixedColumnWidths[0],fixedHeaderHeight));
row.addView(makeTableRowWithText("col2", fixedColumnWidths[1],fixedHeaderHeight));
row.addView(makeTableRowWithText("col3", fixedColumnWidths[2],fixedHeaderHeight));
row.addView(makeTableRowWithText("col4", fixedColumnWidths[3],fixedHeaderHeight));
row.addView(makeTableRowWithText("col5", fixedColumnWidths[4],fixedHeaderHeight));
header.addView(row);


hor = (HorizontalScrollView)findViewById(R.id.scroller);
hor.postDelayed(new Runnable(){
public void run() {
hor.fullScroll(HorizontalScrollView.FOCUS_RIGHT);
}
}, 1L);



TableLayout fixedColumn = (TableLayout) findViewById(R.id.scrollable_part2);
//rest of the table (within a scroll view)
TableLayout scrollablePart = (TableLayout)findViewById(R.id.scrollable_part);
for(int i = 0; i < 10; i++) {
TextView fixedView = makeTableRowWithText("fixed number " + i, scrollableColumnWidths[0], fixedRowHeight);
fixedView.setBackgroundColor(Color.GREEN);
fixedView.setGravity(Gravity.RIGHT);
fixedColumn.addView(fixedView);
row = new TableRow(this);
row.setLayoutParams(wrapWrapTableRowParams);
row.setGravity(Gravity.LEFT);
row.setBackgroundColor(Color.RED);
row.addView(makeTableRowWithText("scroll 1", scrollableColumnWidths[1], fixedRowHeight));
row.addView(makeTableRowWithText("scroll 2", scrollableColumnWidths[1], fixedRowHeight));
row.addView(makeTableRowWithText("scroll 3", scrollableColumnWidths[2], fixedRowHeight));
row.addView(makeTableRowWithText("scroll 4", scrollableColumnWidths[3], fixedRowHeight));
row.addView(makeTableRowWithText("scroll 5", scrollableColumnWidths[4], fixedRowHeight));
scrollablePart.addView(row);
}


}




public TextView makeTableRowWithText(String text, int widthInPercentOfScreenWidth, int fixedHeightInPixels) {
int screenWidth = getResources().getDisplayMetrics().widthPixels;
recyclableTextView = new TextView(this);
recyclableTextView.setText(text);
recyclableTextView.setTextColor(Color.BLACK);
recyclableTextView.setTextSize(20);
recyclableTextView.setWidth(widthInPercentOfScreenWidth * screenWidth / 100);
recyclableTextView.setHeight(fixedHeightInPixels);
return recyclableTextView;
}









@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}

Answer

Gravity is not the solution to this problem, the android:gravity property moves the contents of the element, which is why you can see that all of your 'fixed' texts are aligned to the right hand side of the column.

The order of children in a LinearLayout is solely determined by the order they appear in the layout xml. In a vertical layout they go in order from top to bottom and in a horizontal layout they go in order from left to right. So in your case, if you want to change the order of those columns, you just need to put them in the correct order in your layout:

    <LinearLayout android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
         <HorizontalScrollView
         android:id="@+id/scroller"
         android:layout_width="0dp"
         android:layout_weight="1"
         android:layout_height="wrap_content">
            <TableLayout
                android:id="@+id/scrollable_part"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"/>
         </HorizontalScrollView>
         <TableLayout
                android:id="@+id/scrollable_part2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
    </LinearLayout>

For more about the Gravity property, check the documentation here.

Comments