安卓应用在模拟器上运行正常但无法在真实设备上运行

4

我写了这个简单的应用程序进行测试:一个按钮显示日期和时间,另一个按钮选择随机颜色并显示它。

在模拟器上运行良好,但当我尝试在真实设备上运行应用程序时,按钮无效(不起作用)。

有人可以帮助我理解为什么吗?

MainActivity.java:

package yuvallevy.allyouneedapp;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.Date;
import java.util.Random;

public class MainActivity extends AppCompatActivity {

    private Button btnShowTime;
    private Button btnRandomColor;
    private TextView timeText;
    private TextView randomColorView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnRandomColor = (Button) findViewById(R.id.btnRandomColor);
        btnShowTime = (Button) findViewById(R.id.btnShowTime);
        timeText = (TextView) findViewById(R.id.timeText);
        randomColorView = (TextView) findViewById(R.id.randomColorView);

        btnShowTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String currentDataTimeString = java.text.DateFormat.getDateTimeInstance().format(new Date());
                timeText.setText(currentDataTimeString);
            }
        });

        btnRandomColor.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Random rnd = new Random();
                int color = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
                randomColorView.setBackgroundColor(color);
            }
        });
    }
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <Button
        android:id="@+id/btnShowTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@+id/randomColorView"
        android:layout_toStartOf="@+id/randomColorView"
        android:text="Show Time"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/timeText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/btnRandomColor"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_toEndOf="@+id/btnRandomColor"
        android:layout_toRightOf="@+id/btnRandomColor" />

    <Button
        android:id="@+id/btnRandomColor"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/btnShowTime"
        android:text="Random Color"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/randomColorView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/btnRandomColor"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@+id/btnRandomColor"
        android:layout_toRightOf="@+id/btnRandomColor" />


</RelativeLayout>

AndoirdManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="yuvallevy.allyouneedapp" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

已在真实设备上进行测试 - 三星S6 Edge,搭载Android 5.1.1。该应用程序的最低API为API 16 4.1 Jelly Bean。 - Yuval Levy
OnClickListener 是否被调用? - Madhukar Hebbar
2
我看到你正在使用 "android:supportsRtl",但是你使用的起始/结束布局属性不一致... 你的 TextView 是否被定位在按钮下面,因此无法显示? - Reuben Scratton
你的真实设备上显示的是什么画面?我复制粘贴了你的代码,只有第二个按钮可见... 但它确实起作用了。 - panonski
1
@panonski,你有两个答案。你的问题解决了吗? - Henry
@Henry,不是我提出这个问题的人... - panonski
3个回答

7
我怀疑这个问题与属性android:supportsRtl="true"以及您的设备/模拟器的不同API级别有关。根据官方文档,如果将android:supportsRtl设置为true,并且targetSdkVersion设置为17或更高版本,则会激活各种RTL API,以便您的应用程序可以显示RTL布局。如果将其设置为false或将targetSdkVersion设置为16或更低版本,则RTL API将被忽略或不起作用,您的应用程序将始终表现为从左到右的布局方向。默认情况下,此属性的值为false。该属性是在API级别17中添加的。这可能会导致模拟器和您的设备之间出现不同的行为。您需要根据标志修复布局,或尝试删除此标志。

1
我不认为从右到左的支持是问题所在,但我同意矛盾的放置属性可能会导致未预料的问题。
如果我是你,我会摆脱所有令人困惑的相对放置属性,并用一个更简单的垂直LinearLayout替换RelativeLayout,其中包含两个水平布局(请不要只是从以前的代码中剪切和粘贴它们,最好从头编写这些LinearLayout或使用IDE来最初生成它们)。

0

如果启用了即时运行,会导致某些类被移动。 要禁用即时运行,请转到 文件 -> 设置 -> 构建、执行、部署 -> 即时运行 -> 取消选中“启用即时运行”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接