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



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

这是错误:

E/Android运行时:致命异常:main 进程: com.something.something, PID: 7328 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'java.lang.CharSequence android.widget.TextView.getText()' at com.something.something.FirstActivity$1.onEditorAction(FirstActivity.java:140)

它指向 FirstActivity 的第 140 行:

StringavatarInput = playerAvatar.getText().toString();

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

1)我自己对该文本值进行了硬编码。

2) 第 140 行在我的安卓设备上不返回空值。

因此,问题必须出在「从价印花税」上。我尝试过其他虚拟设备,但没有一个有效

<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" />

public class FirstActivity 扩展 AppCompatActivity 实现 View.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上午餐相机。

从互联网上的快速浏览,你的文本被uf007

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

它说

U+F007 不是有效的 unicode 字符。

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

因此,也许模拟器缺少您的设备具有的语言包?因此,字符串null


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

或者为了证明这就是问题所在,请将文本更改为text="hello world":-)

最新更新