คำตอบ:
โดยทั่วไปมีสามวิธีในการทำสิ่งนี้:
savedInstanceStateเป็นบางส่วนของคำตอบที่แนะนำคุณสามารถแยกแยะความแตกต่างกรณีที่กิจกรรมของคุณถูกสร้างขึ้นเป็นครั้งแรกและถูกเรียกคืนจาก นี้จะกระทำโดยเอาชนะและการตรวจสอบพารามิเตอร์ของonSaveInstanceStateonCreate
คุณสามารถล็อคกิจกรรมในทิศทางเดียวโดยเพิ่มandroid:screenOrientation="portrait"(หรือ"landscape") <activity>ในรายการของคุณ
คุณสามารถบอกระบบว่าคุณตั้งใจจะจัดการกับการเปลี่ยนแปลงหน้าจอด้วยตัวคุณเองโดยระบุandroid:configChanges="orientation|screenSize"ใน<activity>แท็ก วิธีนี้กิจกรรมจะไม่ถูกสร้างขึ้นใหม่ แต่จะได้รับการติดต่อกลับแทน (ซึ่งคุณสามารถเพิกเฉยได้เพราะมันไม่มีประโยชน์สำหรับคุณ)
โดยส่วนตัวแล้วฉันจะไปกับ (3) แน่นอนว่าถ้าล็อคแอปเข้ากับแนวใดแนวหนึ่งก็โอเคกับคุณคุณสามารถไปด้วย (2)
android:configChanges="orientation|screenSize"
android:configChanges="orientation|screenSize"ทำงานได้สำหรับฉัน ขอบคุณ @Pacerier
android:configChanges="orientation|screenSize"ค่า API> = 13 เพราะมีคนจำนวนมากที่เห็นคำตอบของคุณเป็นหลัก!
คำตอบของ Xion นั้นใกล้เคียงกัน แต่ # 3 ( android:configChanes="orientation") จะไม่ทำงานเว้นแต่แอปพลิเคชันจะมีระดับ API เป็น 12 หรือต่ำกว่า
ใน API ระดับ 13 หรือสูงกว่าขนาดหน้าจอจะเปลี่ยนไปเมื่อการวางแนวเปลี่ยนไปดังนั้นสิ่งนี้ยังทำให้กิจกรรมถูกทำลายและเริ่มต้นเมื่อการวางแนวเปลี่ยนไป
เพียงเพิ่มแอตทริบิวต์ "screenSize" อย่างที่ฉันทำด้านล่าง:
<activity
android:name=".YourActivityName"
android:configChanges="orientation|screenSize">
</activity>
ตอนนี้เมื่อคุณเปลี่ยนการวางแนว (และการเปลี่ยนแปลงขนาดหน้าจอ) กิจกรรมจะรักษาสถานะของมันและonConfigurationChanged()ถูกเรียก สิ่งนี้จะทำให้สิ่งที่อยู่บนหน้าจอ (เช่น: เว็บเพจใน Webview) เมื่อการวางแนวเปลี่ยนไป
เรียนรู้สิ่งนี้จากเว็บไซต์นี้: http://developer.android.com/guide/topics/manifest/activity-element.html
นอกจากนี้ยังเห็นได้ชัดว่าเป็นการปฏิบัติที่ไม่ดีดังนั้นโปรดอ่านลิงก์ด้านล่างเกี่ยวกับการจัดการการเปลี่ยนแปลงรันไทม์:
http://developer.android.com/guide/topics/resources/runtime-changes.html
android:configChanges="orientation|screenSize"
คุณเพียงแค่ต้องไปที่AndroidManifest.xmlและภายในหรือในป้ายกำกับกิจกรรมของคุณคุณต้องพิมพ์บรรทัดของรหัสนี้เมื่อมีคนพูดว่า:
android:configChanges="orientation|screenSize"
ดังนั้นคุณจะมีสิ่งนี้:
<activity android:name="ActivityMenu"
android:configChanges="orientation|screenSize">
</activity>
หวังว่ามันจะใช้งานได้!
<activity android:name="com.example.abc"
android:configChanges="orientation|screenSize"></activity>
เพียงเพิ่ม android:configChanges="orientation|screenSize"ในแท็บกิจกรรมของไฟล์รายการ
ดังนั้นกิจกรรมจะไม่เริ่มต้นใหม่เมื่อมีการเปลี่ยนทิศทาง
onSaveInstanceState() onCreate()
เป็นประสบการณ์ของฉันที่จริงแล้วดีกว่าที่จะจัดการกับการวางแนวที่ถูกต้องแทนที่จะพยายามใช้พฤติกรรมที่ไม่ใช่ค่าเริ่มต้น
คุณควรบันทึกรูปภาพที่กำลังแสดงอยู่onSaveInstanceState()และเรียกคืนรูปภาพได้อย่างถูกต้องเมื่อแอปพลิเคชันของคุณทำงานonCreate()อีกครั้ง
android:configChangesควรหลีกเลี่ยงการใช้และใช้เป็นทางเลือกสุดท้ายโปรดอ่านการจัดการการเปลี่ยนแปลงรันไทม์สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการจัดการการรีสตาร์ทอย่างถูกต้องเนื่องจากการเปลี่ยนแปลงการกำหนดค่า"
วิธีนี้เป็นวิธีการทำงานที่ดีที่สุด ในไฟล์รายการเพิ่มของคุณ
<activity
android:configChanges="keyboardHidden|orientation|screenSize"
android:name="your activity name"
android:label="@string/app_name"
android:screenOrientation="landscape">
</activity
และในชั้นเรียนของคุณเพิ่มรหัสต่อไปนี้
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
//your code
} else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
//your code
}
}
เพิ่มandroid:configChanges="keyboardHidden|orientation|screenSize"สำหรับแท็กกิจกรรมแอพทั้งหมดในไฟล์ Manifest
เพียงเพิ่มลงในของคุณ AndroidManifest.xml
<activity android:screenOrientation="landscape">
ฉันหมายถึงมีแท็กกิจกรรมให้เพิ่มเป็นพารามิเตอร์อื่น ในกรณีที่คุณต้องการแนวตั้งให้เปลี่ยนแนวนอนเป็นแนวตั้ง หวังว่านี่จะช่วยได้
ในไฟล์ manifiest เพิ่มในแต่ละกิจกรรมนี้ สิ่งนี้จะช่วยได้
android:configChanges = "orientation|keyboard|keyboardHidden|screenLayout|screenSize"
คำตอบทั้งหมดข้างต้นไม่ได้ผลสำหรับฉัน ดังนั้นฉันได้รับการแก้ไขโดยการกล่าวถึงlabelด้วยscreenOrientationเช่นด้านล่าง ตอนนี้ทุกอย่างเรียบร้อยดี
<activity android:name=".activity.VideoWebViewActivity"
android:label="@string/app_name"
android:configChanges="orientation|screenSize"/>
http://animeshrivastava.blogspot.in/2017/08/activity-lifecycle-oncreate-beating_3.html
@Override
protected void onSaveInstanceState(Bundle b)
{
super.onSaveInstanceState(b);
String str="Screen Change="+String.valueOf(screenChange)+"....";
Toast.makeText(ctx,str+"You are changing orientation...",Toast.LENGTH_SHORT).show();
screenChange=true;
}
บันทึกรายละเอียดภาพในของคุณonPause()หรือonStop()และใช้ในการonCreate(Bundle savedInstanceState)เรียกคืนภาพ
แก้ไข:
ข้อมูลเพิ่มเติมเกี่ยวกับกระบวนการจริงมีรายละเอียดที่นี่http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycleซึ่งแตกต่างใน Honeycomb มากกว่า Android รุ่นก่อนหน้า
เพียงใช้: android:configChanges="keyboardHidden|orientation"
อย่างที่ Pacerier พูดถึง
android:configChanges="orientation|screenSize"
ฉันไม่รู้ว่าทางออกที่ดีที่สุด แต่ฉันอธิบายได้ที่นี่:
ก่อนอื่นคุณต้องมีใบรับรองกับคุณแอปพลิเคชันคลาสของแอปของคุณอยู่ในรายการของคุณ:
<application
android:name=".App"
...
ประการที่สองในแอปในชั้นเรียนของฉันฉันทำสิ่งนี้:
public class App extends Application {
public static boolean isOrientationChanged = false;
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onConfigurationChanged(@NotNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ||
newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
isOrientationChanged = true;
}
}
}
ประการที่สามคุณต้องตั้งค่าสถานะเป็น Orientation Change ในกรณีของฉันฉันจะตั้งค่าเสมอเมื่อมีการเรียกกิจกรรมก่อนหน้านี้ในการนำทางแอปดังนั้นการโทรครั้งเดียวเมื่อกิจกรรมในภายหลังถูกสร้างขึ้น
isOrientationChanged = false;
ดังนั้นทุกครั้งที่ฉันเปลี่ยนการวางแนวของหน้าจอของฉันในบริบทนั้นฉันตั้งมันทุกครั้งที่มันเปลี่ยนการตั้งค่านี้มันจะตรวจสอบว่ามีการเปลี่ยนแปลงในการวางแนวหรือไม่ถ้าใช่มันจะตรวจสอบตามค่าของธงนั้น
โดยทั่วไปฉันต้องใช้มันทุกครั้งที่ฉันทำคำขอติดตั้งแบบอะซิงโครนัสซึ่งเขาเรียกว่าทุกช่วงเวลาที่เปลี่ยนทิศทาง
if (!isOrientationChanged) {
presenter.retrieveAddress(this, idClient, TYPE_ADDRESS);
}
ฉันไม่รู้ว่ามันเป็นทางออกที่หรูหราและสวยงามที่สุดหรือไม่ แต่อย่างน้อยนี่ก็ใช้งานได้ :)
เพิ่มรหัสนี้หลังonCreateเมธอด, ในกิจกรรมของคุณที่มีWebView
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
}
Screen.lockOrientation(this)จากgithub.com/delight-im/Android-BaseLib/blob/master/Source/src/im/…สำหรับสิ่งนี้ อนุญาตให้ปลดล็อคซึ่งรายการไม่ได้