Codename One:如何锁定Interaction Dialog屏幕方向以覆盖设备配置?
Hey there! I’ve run into exactly this requirement before—locking specific dialogs to portrait while forcing one to stay landscape, even when the user has auto-rotation enabled. Let’s break down how to make this work reliably, overriding the device’s default configuration.
Core Approach
The key is to explicitly set the dialog’s screen orientation before it’s displayed, and ensure we clean up after the dialog closes to avoid messing with the parent activity’s orientation settings. We’ll use Android’s built-in orientation constants to enforce the desired mode.
Step-by-Step Implementation
1. Locking Dialogs to Portrait (3 of Your Dialogs)
For each dialog that needs to stay in portrait mode, add the orientation lock right after creating the dialog instance, but before calling show().
Java Example:
// Create your dialog (using AlertDialog as an example) AlertDialog portraitDialog = new AlertDialog.Builder(requireContext()) .setTitle("Portrait Dialog") .setMessage("This dialog stays vertical no matter what!") .setPositiveButton("Close", (dialog, which) -> dialog.dismiss()) .create(); // Lock to portrait orientation portraitDialog.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // Restore parent activity's original orientation when dialog closes portraitDialog.setOnDismissListener(dialogInterface -> { requireActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); }); // Show the dialog portraitDialog.show();
Kotlin Example:
val portraitDialog = AlertDialog.Builder(requireContext()) .setTitle("Portrait Dialog") .setMessage("This dialog stays vertical no matter what!") .setPositiveButton("Close") { dialog, _ -> dialog.dismiss() } .create() // Lock to portrait portraitDialog.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT // Restore activity orientation on dismiss portraitDialog.setOnDismissListener { requireActivity().requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED } portraitDialog.show()
2. Locking the Single Dialog to Landscape
For your landscape-only dialog, use the same pattern but swap the orientation constant:
Java Example:
AlertDialog landscapeDialog = new AlertDialog.Builder(requireContext()) .setTitle("Landscape Dialog") .setMessage("This dialog stays horizontal at all times.") .setPositiveButton("Close", (dialog, which) -> dialog.dismiss()) .create(); // Lock to landscape orientation landscapeDialog.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // Restore parent activity's orientation on dismiss landscapeDialog.setOnDismissListener(dialogInterface -> { requireActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); }); landscapeDialog.show();
Kotlin Example:
val landscapeDialog = AlertDialog.Builder(requireContext()) .setTitle("Landscape Dialog") .setMessage("This dialog stays horizontal at all times.") .setPositiveButton("Close") { dialog, _ -> dialog.dismiss() } .create() // Lock to landscape landscapeDialog.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE // Restore activity orientation on dismiss landscapeDialog.setOnDismissListener { requireActivity().requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED } landscapeDialog.show()
3. For Custom Dialog Classes
If you’re using a custom Dialog subclass (instead of AlertDialog), set the orientation in the onCreate() method:
Java Custom Dialog:
public class CustomPortraitDialog extends Dialog { public CustomPortraitDialog(@NonNull Context context) { super(context); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Lock orientation here setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setContentView(R.layout.your_custom_dialog_layout); // Don't forget to add dismiss listener to restore activity orientation! setOnDismissListener(dialogInterface -> { ((Activity) getContext()).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); }); } }
Critical Notes to Avoid Common Pitfalls
- Always restore the activity’s orientation: If you skip this step, your parent activity will stay locked to the dialog’s orientation even after the dialog closes. Using
SCREEN_ORIENTATION_UNSPECIFIEDreverts it to the system’s default behavior (respecting auto-rotation settings). - Call orientation lock before
show(): Setting the orientation after the dialog is displayed won’t work consistently across devices. - Choose the right orientation constant:
SCREEN_ORIENTATION_PORTRAIT: Locks to normal portrait (upside-up only).SCREEN_ORIENTATION_SENSOR_PORTRAIT: Allows both normal and reverse portrait (upside-down).SCREEN_ORIENTATION_LANDSCAPE: Locks to normal landscape (right-side up).SCREEN_ORIENTATION_SENSOR_LANDSCAPE: Allows both normal and reverse landscape.
If you’re using Jetpack Compose for your dialogs, the approach is similar—you can use LocalContext to access the activity and set the orientation via ActivityCompat.setRequestedOrientation(), then restore it when the dialog is dismissed.
Give this a shot, and let me know if you hit any device-specific quirks or need adjustments for your specific setup!
内容的提问来源于stack exchange,提问作者rainer

