无法在android中更改为横向模式

时间:2017-11-14 17:13:42

标签: android xml android-layout netbeans

由于我对应用程序进行了很多更改,因此我开始使用此主题来反映它们。我在改变方向时仍然遇到问题。

这是代码

Activity

    package com.flash;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import android.util.Log;

public class QuizActivity extends Activity {

private static final String TAG = "QuizActivity";

private Button mTrueButton;
private Button mFalseButton;
private ImageButton mPrevButton;
private ImageButton mNextButton;
private TextView mQuestionTextView;

private TrueFalse[] mQuestionBank;
private int mCurrentIndex = 0;

/**
 * Called when the activity is first created.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG, "onCreate(Bundle)");
    setQuestionBank();
    if (getResources().getConfiguration().orientation
            == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
        setContentView(R.layout.activity_quiz);
        ProcessPortrait();
    } else {
        if (getResources().getConfiguration().orientation
            == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
        setContentView(R.layout.mainland);
        ProcessLandscape();
        }
    }
}

private void ProcessPortrait() {
    mQuestionTextView = (TextView) findViewById(R.id.question_text_view);
    mQuestionTextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length;
            updateQuestion();
        }
    });
    updateQuestion();

    mTrueButton = (Button) findViewById(R.id.true_button);
    mTrueButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            checkAnswer(true);
        }
    });

    mFalseButton = (Button) findViewById(R.id.false_button);
    mFalseButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            checkAnswer(false);
        }
    });

    mPrevButton = (ImageButton) findViewById(R.id.prev_button);
    mPrevButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mCurrentIndex == 0) {
                mCurrentIndex = mQuestionBank.length - 1;
            } else {
                mCurrentIndex = (mCurrentIndex - 1) % mQuestionBank.length;
            }
            updateQuestion();
        }
    });

    mNextButton = (ImageButton) findViewById(R.id.next_button);
    mNextButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length;
            updateQuestion();
        }
    });
}

private void ProcessLandscape() {
    mQuestionTextView = (TextView) findViewById(R.id.question_text_view);
    mQuestionTextView.setOnClickListener(new View.OnClickListener() {
        @Override        
        public void onClick(View v) {
            mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length;
            updateQuestion();
        }
    });
    updateQuestion();

    mTrueButton = (Button) findViewById(R.id.true_button);
    mTrueButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            checkAnswer(true);
        }
    });

    mFalseButton = (Button) findViewById(R.id.false_button);
    mFalseButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            checkAnswer(false);
        }
    });

    mNextButton = (ImageButton) findViewById(R.id.next_button);
    mNextButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length;
            updateQuestion();
        }
    });
}

private void setQuestionBank() {
    mQuestionBank = new TrueFalse[]{
        new TrueFalse(R.string.question_oceans, true),
        new TrueFalse(R.string.question_mideast, false),
        new TrueFalse(R.string.question_africa, false),
        new TrueFalse(R.string.question_americas, true),
        new TrueFalse(R.string.question_asia, true)
    };
}

private void updateQuestion() {
    int question = mQuestionBank[mCurrentIndex].getmQuestion();
    mQuestionTextView.setText(question);
}

private void checkAnswer(boolean userPressedTrue) {
    boolean answerIsTrue = mQuestionBank[mCurrentIndex].ismTrueQuestion();

    int messageResId = 0;

    if (userPressedTrue == answerIsTrue) {
        messageResId = R.string.correct_Toast;
    } else {
        messageResId = R.string.incorrect_Toast;
    }

    Toast.makeText(this, messageResId, Toast.LENGTH_SHORT).show();
}

@Override
public void onStart() {
    super.onStart();
    Log.d(TAG, "onStart() called");
}

@Override
public void onPause() {
    super.onPause();
    Log.d(TAG, "onStart() called");
}

@Override
public void onResume() {
    super.onResume();
    Log.d(TAG, "onResume() called");
}

@Override
public void onStop() {
    super.onStop();
    Log.d(TAG, "onStop() called");
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "onDestroy() called");
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (getResources().getConfiguration().orientation
            == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
        setContentView(R.layout.main);
        ProcessPortrait();
    } else if (getResources().getConfiguration().orientation
            == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
        setContentView(R.layout.mainland);
        ProcessLandscape();
    }
}

}

XML

Portrait

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:gravity="center"
          android:orientation="vertical">

    <TextView
        android:id="@+id/question_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="24dp"
        android:textSize="10sp"/>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/true_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="10sp"
            android:text="@string/true_button" />

        <Button
            android:id="@+id/false_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="10sp"
            android:text="@string/false_button" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <ImageButton
            android:id="@+id/prev_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="10sp"
            android:contentDescription="@string/prev_button"
            android:src="@drawable/arrow_left"/>

        <ImageButton
            android:id="@+id/next_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="10sp"
            android:contentDescription="@string/next_button"
            android:src="@drawable/arrow_right"/>

        </LinearLayout>

    </LinearLayout>

风景

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

    <TextView
        android:id="@+id/question_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:padding="24dp"
        android:textSize="10sp"/>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/true_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="10sp"
            android:text="@string/true_button" />

        <Button
            android:id="@+id/false_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="10sp"
            android:text="@string/false_button" />

    </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_vertical|center_horizontal"
            android:orientation="horizontal">

            <ImageButton
                android:id="@+id/next_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="10sp"
                android:contentDescription="@string/next_button"
                android:gravity="bottom|right"
                android:src="@drawable/arrow_right"/>

        </LinearLayout>

    </FrameLayout>

Manifest

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.flash"
        android:versionCode="1"
        android:versionName="1.0"
    >
        <application android:label="@string/app_name" 
                 android:icon="@drawable/ic_launcher" >
            <activity android:name=".QuizActivity"
                  android:label="@string/app_name"
                  android:configChanges="orientation|
        keyboardHidden|screenSize">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>

当我使用手机进行调试时,横向可以正常工作,虽然可能是我的手机正在调整到新的方向而不是应用。

我目前无法在使用模拟器时让调试器工作,所以这也是我需要帮助的问题。

当我运行/调试应用程序时,显示主页,我必须按下模拟器上的最近应用程序按钮,然后双击该应用程序以使其前进,嗯,还有另一个问题。

无论如何,我们将非常感谢任何帮助

3 个答案:

答案 0 :(得分:0)

当方向发生变化时,您似乎正试图与系统作斗争。

  1. 我建议不要覆盖onConfigurationChanged()方法。
  2. 我建议不要在onCreate()方法中检查活动的方向。
  3. 使用resource qualifiers确定使用的布局。
  4. 当你以这种方式旋转活动时,所有人都会说活动将被销毁并重新创建。除非你有一个很大的理由不允许销毁/重新创建活动,否则我建议你不要手动处理方向。如果您希望以这种方式更改方向,则需要将代码更改为与此类似的内容:

    首先,将您的xml布局文件重命名为同名,例如activity_quiz。然后将它们放在res文件夹中的不同目录中,例如res/layout/activity_quiz.xmlres/layout-land/activity_quiz.xml

    第二个更改是删除android:configChanges="orientation"选项。您可以放心地保留其他两个configChanges选项。

    通过完全删除onConfigurationChanged()方法,第三次更改您的活动代码。系统将处理这个问题。您的onCreate()方法应如下所示:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setQuestionBank();
        setContentView(R.layout.activity_quiz);
    }
    

    更改活动代码后,您应该能够将ProcessPortrait()ProcessLandscape()方法合并为一个单一的方法,几乎​​保持您现在的确切逻辑,只需确保执行在访问您的观看之前进行空检查,以确保应用程序不会因NullPointerException而崩溃。

    如果您有方向更改需要保存/恢复的数据,例如计数,您还需要查看状态保存和恢复。

    希望这会有所帮助。如果不是,我可以尝试澄清事情。

答案 1 :(得分:0)

The best way for you scenario would be to remove 
android:configChanges="orientation" from your manifest since you just want to change layouts during orientation.

    If you use android:configChanges="orientation" 
    then you must implement in activity like:

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            // Handle Lanscape codes here
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            // Handle portrait codes here
        }
    }

答案 2 :(得分:0)

我安装了一些Android sdk的更新,当我运行应用程序时,我收到一条消息,说无法找到从我的项目目录导入的ant build xml。尝试了几件事要纠正。浪费时间。我决定回到使用Android Studio,现在该应用程序可以在横向和纵向中使用,每个都有自己的布局。

感谢大家的帮助。我们几乎拥有它。我对netbeans的建议是稳定他们的平台,就像开发人员破坏它一样。

此问题已正式结束