当前位置: 首页 > 知识库问答 >
问题:

Android应用程序适用于手机,但不适用于AVD

苏乐童
2023-03-14

当我在Android手机上调试应用程序时,我绝对没有遇到任何错误,但在AVD上,我一开始就得到了一个NullPointerException()。我的Android设备在22 API的Lollipop(5.1.1)上运行,我的AVD在28 API的Pie(9.0)上运行。我在gradle中将最小SDK设置为21,编译SDK设置为28。

这是错误:

E/AndroidRuntime:致命html" target="_blank">异常:主进程:com。某物一些东西,PID:7328 java。lang.NullPointerException:尝试调用虚拟方法的java。lang.CharSequence android。小装置。文本视图。在com上的空对象引用上的getText()。某物某物FirstActivity 1美元。onEditorAction(FirstActivity.java:140)

它指向Firstactive的第140行:

字符串avatarInput=playerAvatar。getText()。toString();

它引用XML属性并将其文本值分配给字符串。现在,我确信XML实际上有一个文本值,原因有二:

1) 我自己硬编码了那个文本值。

2) 在我的Android设备上,第140行没有返回null。

因此,问题必须来自AVD。我尝试过其他虚拟设备,但都不起作用

<TextView
    android:id="@+id/avatar"
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:layout_alignParentStart="true"
    android:layout_alignParentLeft="true"
    android:textSize="30sp"
    android:clickable="true"
    android:focusable="true"
    android:gravity="center"
    android:singleLine="true"
    android:fontFamily= "@font/font_awesome_5_pro_light_300"
    android:visibility="gone"
    android:text="\uf007" />

公共类FirstActivity扩展了AppCompatActivity实现视图。OnClickListener{

private static final String TAG = "FirstActivity";

private static final List<String> namesArray = new ArrayList<>();

static final String KEY_NAME = "name";
static final String KEY_AVATAR = "avatar";
static final String KEY_ICON = "icon";

FirebaseFirestore db = FirebaseFirestore.getInstance();

RelativeLayout firstActLayout;

TextView numberOfPlayers;
EditText addPlayer;
TextView doneButton;
ImageView settingsButton;
TextView sunOrMoon;

TextView playerAvatar;
TextView characterImage;


private static int playerSum = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.first_activity);

    firstActLayout = findViewById(R.id.first_act_layout);
    numberOfPlayers = findViewById(R.id.number_of_players);
    addPlayer = findViewById(R.id.add_player);
    doneButton = findViewById(R.id.done_button);
    settingsButton = findViewById(R.id.settings_button);
    sunOrMoon = findViewById(R.id.sun_or_moon);

    addPlayer.setOnClickListener(this);
    doneButton.setOnClickListener(this);
    settingsButton.setOnClickListener(this);
    numberOfPlayers.setOnClickListener(this);
    sunOrMoon.setOnClickListener(this);

    playerAvatar = findViewById(R.id.avatar);
    characterImage = findViewById(R.id.icon);

}

@Override
protected void onResume(){
    super.onResume();

}

@Override
public void onClick(View v){
    switch (v.getId()){
        case R.id.add_player:
            addPlayers();
            break;
        case R.id.done_button:
            onClickConditions();
            break;
        case R.id.settings_button:
            break;
        case R.id.number_of_players:
            Toast.makeText(this, "Total number of players", Toast.LENGTH_SHORT).show();
            break;
        case R.id.sun_or_moon:
            Toast.makeText(this, "DAY", Toast.LENGTH_SHORT).show();
            break;
        default:
            Toast.makeText(this, "DAY", Toast.LENGTH_SHORT).show();
            break;
    }
}

public void addPlayers (){
    addPlayer.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

            if (actionId == EditorInfo.IME_ACTION_NEXT) {

                namesArray.add(addPlayer.getText().toString());
                String nameInput = addPlayer.getText().toString();
                String avatarInput = playerAvatar.getText().toString();
                String characterInput = characterImage.getText().toString();
                addPlayer.getText().clear();
                playerSum++;
                numberOfPlayers.setText("");
                numberOfPlayers.setText(String.valueOf(playerSum));

                Map <String, Object> player = new HashMap<>();
                player.put(KEY_NAME, nameInput);
                player.put(KEY_AVATAR, avatarInput);
                player.put(KEY_ICON, characterInput);

                db.collection("Players")       .document("Player_".concat(String.valueOf(playerSum)))
                        .set(player)
                        .addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                Toast.makeText(FirstActivity.this,"Name Saved", Toast.LENGTH_SHORT)
                                        .show();
                            }
                        })
                        .addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Toast.makeText(FirstActivity.this,"Error!", Toast.LENGTH_SHORT)
                                        .show();
                                Log.d(TAG, e.toString());
                            }
                        });
            }
            return false;
        }
    });
}

public void onClickConditions(){
    if (playerSum >= 5){
        Intent intent1 = new Intent(this, SecondActivity.class);
        startActivity(intent1);
        return;
    }
    Toast.makeText(this, "Minimum of 5 players are needed", Toast.LENGTH_LONG)
            .show();
}

}

我必须使用AVD的原因是因为我的应用程序使用相机,我手机的相机坏了,所以我必须在AVD上运行我的应用程序。我已经将我的AVD相机设置为我的网络摄像头,但是我必须在140行通过错误,然后才能在AVD上使用相机。

共有1个答案

于意智
2023-03-14

从互联网上快速浏览,您的文本是

这里是:https://www.fileformat.info/info/unicode/char/f007/index.htm

它说

U F007不是有效的unicode字符。

...

Android不支持完整的Unicode字符集,它支持的部分取决于特定的设备和该设备的分布位置(事实上是运营商的分布位置)。

那么,也许模拟器缺少您设备上的语言包?因此,字符串为空。

解决方案可能是查看可下载字体:https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts

或者为了证明这就是问题所在,将文本更改为

 类似资料:
  • 我正在尝试使用firebase手机验证登录,但它不起作用。代码没有被发送。我曾尝试使用“keytool-list-v-keystore~/.android/debug.keystore-alias androiddebugkey-storepass-android-keypass-android”添加sha-1和sha-256键(我也尝试了其他方法),但仍然不起作用。我试图启用android设备验

  • 问题内容: 嗨,我只是简单地尝试在www.example.com上获取h1标签,该标签显示为“ Example Domain”。该代码适用于http://www.example.com,但不适用于https://www.exmaple.com。我该如何解决这个问题?谢谢 问题答案: PhantomJSDriver不支持(所有)DesiredCapabilities。 你会需要: 记录在这里:htt

  • 所以我使用这种方法写入文件,它在windows上运行完全正常,但在mac上运行时,它会创建文件,但它们是空的。 我知道数据是正确的,因为它打印正确。感谢您的任何帮助,这真的让我绊倒了。

  • 我只是在听讲座:(这是错误消息 E/Android运行时: 致命异常: 主进程: 8893 java.lang.空指针异常: 尝试调用虚拟方法 '布尔 java.lang.字符串.contains(java.lang.CharSequence)'.java.java.java 在空对象引用上android.os.AsyncTask.access$900(AsyncTask.java:192) at

  • 列名称的类型为int[] 上述查询适用于postgresql,但不适用于hsqldb,甚至适用于sql 尝试的hsqldb版本:2.2.9和2.3.0 在hsqldb中工作的sql是从table_name中选择x,unnest(column_name)y(x)x和y不是该表的列。

  • 一个使用Jersey在Java中构建的方法,它接受两个参数并存储在数据库中,它可以和postman一起正常工作,但当我在Android应用程序中使用它时,它不起作用。我试图通过截击和改装发送请求。 服务器端代码: Android代码: 公共无效寄存器(最终字符串用户名、最终字符串密码){ 邮差回应 截击请求: 公共无效寄存器Volley(最终字符串用户名,最终字符串密码){