如何在android屏幕中居中文本(不在父级中心)

时间:2016-08-10 21:53:08

标签: android android-layout

我希望根据Android Studio 2.1中的代码示例,根据默认的“空活动”将小文本置于屏幕中央。

我今天使用的布局xml文件如下所示。我通过import java.awt.AWTException; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Robot; import java.awt.image.BufferedImage; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.*; import javax.imageio.ImageIO; import java.io.File; class jframeExample { public static BufferedImage getImageData( Component component) { BufferedImage image = new BufferedImage( component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_RGB ); component.printAll( image.createGraphics() ); return image; } static Robot robot = null; public static void main(String[] args){ Runnable r = new Runnable() { public void run() { try { if(robot == null) robot = new Robot(); } catch (AWTException e1) { e1.printStackTrace(); } final JFrame f = new JFrame("JFrame Border"); f.setLayout(new BorderLayout()); f.setLocation(500,300); f.setSize(560, 420); f.getContentPane().setBackground(Color.BLUE); JMenuItem screenshot = new JMenuItem("TakeSnapshot"); screenshot.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent ae) { new Thread(() -> { try { Thread.sleep(100); } catch (InterruptedException e1) { e1.printStackTrace(); } int screenshotX = f.getContentPane().getLocationOnScreen().x; int screenshotY = f.getContentPane().getLocationOnScreen().y; int screenshotWidth = f.getContentPane().getWidth(); int screenshotHeight = f.getContentPane().getHeight(); BufferedImage imageOutput = robot.createScreenCapture(new Rectangle(screenshotX, screenshotY, screenshotWidth, screenshotHeight)); try { // write the image as a PNG ImageIO.write( imageOutput, "png", new File("CapturedImage.png")); } catch(Exception e) { e.printStackTrace(); } }).start(); } } ); JMenu menu = new JMenu("Menu"); menu.add(screenshot); JMenuBar menuBar = new JMenuBar(); menuBar.add(menu); f.setJMenuBar(menuBar); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }; SwingUtilities.invokeLater(r); } } 正常地在OnCreate方法中对它进行充气,因此xml中定义的布局不会填满整个屏幕。因此,setContentView会将我的文本置于父级中心,但不会居中于屏幕中心。如何让我的文字在屏幕上居中,同时保持我的操作栏?

问题说明 以父母为中心导致“不良”的位置。以屏幕为中心会给出“好”的位置。

The problem. Centering in parent leads to "bad" position. Centering on screen would give "good" postion.

main_activity.xml

layout_centerInParent

2 个答案:

答案 0 :(得分:1)

使用例如CoordinatorLayout。这种布局中的元素与它们之间没有关系,因此可以是一个在另一个上。

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:id="@+id/root_layout"
>

    <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <TextView
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:layout_gravity="center"
            android:layout_marginBottom="?attr/actionBarSize"
            android:text="Text not in center">

        </TextView>

    </RelativeLayout>


    <!-- This is centered TextView -->
    <TextView
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_gravity="center"
        android:layout_marginBottom="?attr/actionBarSize"
        android:text="Text in center"
        >

    </TextView>
</android.support.design.widget.CoordinatorLayout>

两件重要的事情:

  1. 居中的TextView应该是CoordinatorLayout的子项
  2. 以CoordinatorLayout为中心使用属性 android:layout_gravity =&#34; center&#34;
  3. 如果我们想要精确的中心,我们需要更改保证金,因为工具栏大小是我们不需要的确切中心差异,我使用 android:layout_marginBottom =&#34;?attr / actionBarSize&#34; 来按工具栏高度向上移动TextView。
  4.   

    以编程方式计算屏幕和设置位置不是好主意,例如当用户旋转屏幕时,这可能会导致不想要的问题。

答案 1 :(得分:0)

您可以通过

获取屏幕的真实尺寸
    DisplayMetrics displayMetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    displayMetrics.widthPixels; //screen width
    displayMetrics.heightPixels; //screen height

然后

    LayoutParams layoutParams = new LayoutParams(int width, int height);
    layoutParams.setMargins(int left, int top, int right, int bottom);
    viewToCenter.setLayoutParams(layoutParams);