横向模式错误
Landscape Mode Errors
我正在开发 Android 应用程序。在 LandingPage 和 SignIn/SignUp 部分工作。我在风景模式方面遇到了一些问题。
对于 setFontType() 和 addSoundtoButtons() 方法,涉及 "normal" 按钮的部分正在运行,而涉及 "landscape" 按钮的部分未运行。
对于字体方法,我收到以下错误消息:
java.lang.NullPointerException: 尝试在空对象引用
上调用虚拟方法'void android.widget.Button.setTypeface(android.graphics.Typeface)'
对于声音方法,我收到以下错误消息:
java.lang.NullPointerException: 尝试在空对象引用
上调用虚拟方法'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)'
代码如下:
public class LandingPage extends AppCompatActivity {
Button log_in_normal, sign_up_normal, log_in_landscape, sign_up_landscape;
Typeface tfc_button;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_landing_page);
log_in_normal = (Button) findViewById(R.id.LogIn_Button_Normal);
sign_up_normal = (Button) findViewById(R.id.SignUp_Button_Normal);
log_in_landscape = (Button) findViewById(R.id.SignUp_Button_Landscape);
sign_up_landscape = (Button) findViewById(R.id.LogIn_Button_Landscape);
setFontType();
addSoundtoButtons();
}
public void addSoundtoButtons(){
//Add Sound to the Buttons
final MediaPlayer mediaPlayer = MediaPlayer.create(this,R.raw.button_click_sound);
log_in_normal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mediaPlayer.start();
}
});
sign_up_normal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mediaPlayer.start();
}
});
log_in_landscape.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer.start();
}
});
sign_up_landscape.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer.start();
}
});
}
public void setFontType(){
//Set Font Type for Buttons
tfc_button = Typeface.createFromAsset(getAssets(), "fonts/TEMPSITC.TTF");
log_in_normal = (Button) findViewById(R.id.LogIn_Button_Normal);
sign_up_normal = (Button) findViewById(R.id.SignUp_Button_Normal);
log_in_landscape = (Button) findViewById(R.id.LogIn_Button_Landscape);
sign_up_landscape = (Button) findViewById(R.id.SignUp_Button_Landscape);
log_in_normal.setTypeface(tfc_button);
sign_up_normal.setTypeface(tfc_button);
log_in_landscape.setTypeface(tfc_button);
sign_up_landscape.setTypeface(tfc_button);
}
public void OnClick(View view){
if (view.getId() == R.id.LogIn_Button_Normal){
Intent intent = new Intent(this, SignInPage.class);
startActivity(intent);
}else if (view.getId() == R.id.SignUp_Button_Normal){
Intent intent = new Intent(this, SignUpPage.class);
startActivity(intent);
}else if (view.getId() == R.id.LogIn_Button_Landscape){
Intent intent = new Intent(this, SignInPage.class);
startActivity(intent);
}else if (view.getId() == R.id.SignUp_Button_Landscape){
Intent intent = new Intent(this, SignUpPage.class);
startActivity(intent);
}
}
}
为简单起见,假设您的 res/layout/
目录中有此布局:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/LogIn_Button_Normal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Log in"/>
<Button
android:id="@+id/SignUp_Button_Normal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sign up"/>
</LinearLayout>
此外,您的 res/layout-land/
目录中有此布局:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
android:id="@+id/LogIn_Button_Landscape"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Log in"/>
<Button
android:id="@+id/SignUp_Button_Landscape"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sign up"/>
</LinearLayout>
需要了解的关键是,您的 activity 只会膨胀 其中一个 (基于您设备的方向),而不是两者。这意味着:
- 如果设备处于纵向模式,
LogIn_Button_Normal
和 SignUp_Button_Normal
将在 布局中
- 如果设备处于横向模式,
LogIn_Button_Landscape
和 SignUp_Button_Landscape
将在布局中
- 无论您的设备处于哪个方向,其他 按钮都不会出现在布局中
通常,处理此问题的方法是确保您的两个不同布局对每个元素使用相同的 id
。也就是说,您的每个布局都应该只有 LogIn_Button
,而不是 LogIn_Button_Normal
和 LogIn_Button_Landscape
。这样,无论两种布局中的哪一种被放大,您都将始终拥有一个 LogIn_Button
按钮。
因此,将两种布局中的 ID 更改为 LogIn_Button
和 SignUp_Button
,然后将代码更改为:
public class LandingPage extends AppCompatActivity {
Button log_in, sign_up;
Typeface tfc_button;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_landing_page);
log_in = (Button) findViewById(R.id.LogIn_Button);
sign_up = (Button) findViewById(R.id.SignUp_Button);
setFontType();
addSoundtoButtons();
}
public void addSoundtoButtons() {
//Add Sound to the Buttons
final MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.button_click_sound);
log_in.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mediaPlayer.start();
}
});
sign_up.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mediaPlayer.start();
}
});
}
public void setFontType() {
//Set Font Type for Buttons
tfc_button = Typeface.createFromAsset(getAssets(), "fonts/TEMPSITC.TTF");
log_in.setTypeface(tfc_button);
sign_up.setTypeface(tfc_button);
}
public void OnClick(View view) {
if (view.getId() == R.id.LogIn_Button) {
Intent intent = new Intent(this, SignInPage.class);
startActivity(intent);
}
else if (view.getId() == R.id.SignUp_Button) {
Intent intent = new Intent(this, SignUpPage.class);
startActivity(intent);
}
}
}
我正在开发 Android 应用程序。在 LandingPage 和 SignIn/SignUp 部分工作。我在风景模式方面遇到了一些问题。
对于 setFontType() 和 addSoundtoButtons() 方法,涉及 "normal" 按钮的部分正在运行,而涉及 "landscape" 按钮的部分未运行。
对于字体方法,我收到以下错误消息: java.lang.NullPointerException: 尝试在空对象引用
上调用虚拟方法'void android.widget.Button.setTypeface(android.graphics.Typeface)'对于声音方法,我收到以下错误消息: java.lang.NullPointerException: 尝试在空对象引用
上调用虚拟方法'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)'代码如下:
public class LandingPage extends AppCompatActivity {
Button log_in_normal, sign_up_normal, log_in_landscape, sign_up_landscape;
Typeface tfc_button;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_landing_page);
log_in_normal = (Button) findViewById(R.id.LogIn_Button_Normal);
sign_up_normal = (Button) findViewById(R.id.SignUp_Button_Normal);
log_in_landscape = (Button) findViewById(R.id.SignUp_Button_Landscape);
sign_up_landscape = (Button) findViewById(R.id.LogIn_Button_Landscape);
setFontType();
addSoundtoButtons();
}
public void addSoundtoButtons(){
//Add Sound to the Buttons
final MediaPlayer mediaPlayer = MediaPlayer.create(this,R.raw.button_click_sound);
log_in_normal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mediaPlayer.start();
}
});
sign_up_normal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mediaPlayer.start();
}
});
log_in_landscape.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer.start();
}
});
sign_up_landscape.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer.start();
}
});
}
public void setFontType(){
//Set Font Type for Buttons
tfc_button = Typeface.createFromAsset(getAssets(), "fonts/TEMPSITC.TTF");
log_in_normal = (Button) findViewById(R.id.LogIn_Button_Normal);
sign_up_normal = (Button) findViewById(R.id.SignUp_Button_Normal);
log_in_landscape = (Button) findViewById(R.id.LogIn_Button_Landscape);
sign_up_landscape = (Button) findViewById(R.id.SignUp_Button_Landscape);
log_in_normal.setTypeface(tfc_button);
sign_up_normal.setTypeface(tfc_button);
log_in_landscape.setTypeface(tfc_button);
sign_up_landscape.setTypeface(tfc_button);
}
public void OnClick(View view){
if (view.getId() == R.id.LogIn_Button_Normal){
Intent intent = new Intent(this, SignInPage.class);
startActivity(intent);
}else if (view.getId() == R.id.SignUp_Button_Normal){
Intent intent = new Intent(this, SignUpPage.class);
startActivity(intent);
}else if (view.getId() == R.id.LogIn_Button_Landscape){
Intent intent = new Intent(this, SignInPage.class);
startActivity(intent);
}else if (view.getId() == R.id.SignUp_Button_Landscape){
Intent intent = new Intent(this, SignUpPage.class);
startActivity(intent);
}
}
}
为简单起见,假设您的 res/layout/
目录中有此布局:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/LogIn_Button_Normal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Log in"/>
<Button
android:id="@+id/SignUp_Button_Normal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sign up"/>
</LinearLayout>
此外,您的 res/layout-land/
目录中有此布局:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
android:id="@+id/LogIn_Button_Landscape"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Log in"/>
<Button
android:id="@+id/SignUp_Button_Landscape"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sign up"/>
</LinearLayout>
需要了解的关键是,您的 activity 只会膨胀 其中一个 (基于您设备的方向),而不是两者。这意味着:
- 如果设备处于纵向模式,
LogIn_Button_Normal
和SignUp_Button_Normal
将在 布局中
- 如果设备处于横向模式,
LogIn_Button_Landscape
和SignUp_Button_Landscape
将在布局中 - 无论您的设备处于哪个方向,其他 按钮都不会出现在布局中
通常,处理此问题的方法是确保您的两个不同布局对每个元素使用相同的 id
。也就是说,您的每个布局都应该只有 LogIn_Button
,而不是 LogIn_Button_Normal
和 LogIn_Button_Landscape
。这样,无论两种布局中的哪一种被放大,您都将始终拥有一个 LogIn_Button
按钮。
因此,将两种布局中的 ID 更改为 LogIn_Button
和 SignUp_Button
,然后将代码更改为:
public class LandingPage extends AppCompatActivity {
Button log_in, sign_up;
Typeface tfc_button;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_landing_page);
log_in = (Button) findViewById(R.id.LogIn_Button);
sign_up = (Button) findViewById(R.id.SignUp_Button);
setFontType();
addSoundtoButtons();
}
public void addSoundtoButtons() {
//Add Sound to the Buttons
final MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.button_click_sound);
log_in.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mediaPlayer.start();
}
});
sign_up.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mediaPlayer.start();
}
});
}
public void setFontType() {
//Set Font Type for Buttons
tfc_button = Typeface.createFromAsset(getAssets(), "fonts/TEMPSITC.TTF");
log_in.setTypeface(tfc_button);
sign_up.setTypeface(tfc_button);
}
public void OnClick(View view) {
if (view.getId() == R.id.LogIn_Button) {
Intent intent = new Intent(this, SignInPage.class);
startActivity(intent);
}
else if (view.getId() == R.id.SignUp_Button) {
Intent intent = new Intent(this, SignUpPage.class);
startActivity(intent);
}
}
}