Это потому, что ваш диалог не воссоздается после изменения ориентации экрана . И у этого есть старая структура ресурса.
Для решения вы можете обнаружить изменение ориентации и восстановить диалог , если он уже открыт.
Вы можете использовать onConfigurationChanged
в своей Активности для обнаружения изменения ориентации.
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
if (inviteDialog !=null && inviteDialog.isShowing()){
inviteDialog .dismiss();
displayInviteDialog();
}
}
private void displayInviteDialog() {
contactList = new ArrayList<>();
inviteDialog = new VeriDocDialog(ScratchAndWinActivity.this,
VeriDocDialog.TYPE_INVITE,
R.drawable.invite_32,
getString(R.string.str_invite_instruction),
getString(R.string.str_equation_invite),
contactList, VeriDocDialog.TYPE_INVITE);
inviteDialog.show();
}
И немного отредактируйте регистрацию активности манифеста.
<activity android:name=".YourActivity"
android:configChanges="orientation">
Предложение:
1> Вы должны использовать match_parent для родительского элемента макета Dialog.
android:layout_width="match_parent"
android:layout_height="match_parent"
2> Установить программную высоту и ширину диалога match_parent также. См этот ответ
Обновление
Используйте NestedScrollView вместо ScrollView , поскольку сам ListView имеет свойство прокрутки, которое может вызвать конфликты.
Обновление
Я создал образец, который отлично работает в обоих режимах, вы будете удивлены, узнав, что я не установил никакого специального свойства для диалога, чтобы это работало. Вот образец.
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.innovanathinklabs.sample.R;
/**
* Created by KHEMRAJ on 8/29/2018.
*/
public class ListActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyDialog dialog = new MyDialog(this);
dialog.show();
Window window = dialog.getWindow();
window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
}
public static class MyDialog extends Dialog {
String[] mobileArray = {
"Android", "IPhone", "WindowsMobile", "Blackberry",
"WebOS", "Ubuntu", "Windows7", "Max OS X", "Android", "IPhone", "WindowsMobile", "Blackberry",
"WebOS", "Ubuntu", "Windows7", "Max OS X", "Android", "IPhone", "WindowsMobile", "Blackberry",
"WebOS", "Ubuntu", "Windows7", "Max OS X",
};
public MyDialog(@NonNull Context context) {
super(context);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_sample);
ArrayAdapter adapter = new ArrayAdapter<>(getContext(),
R.layout.row_list, mobileArray);
ListView listView = findViewById(R.id.listView);
listView.setAdapter(adapter);
}
}
}
и dialog_sample.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!--in this view, horizontal and vertical both dialog has scrollable List and other view looks static-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="5">
<!--place your all top content here-->
</LinearLayout>
<!--weight 1 is giving List view the available space. -->
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="5"/>
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/app_name"/>
</LinearLayout>
Вот вывод
Обратите внимание, что.
- Я не справился с ориентацией, он работает как положено.
- Я установил вес для детей. Таким образом, он автоматически вписывается в обе ориентации.
- Проблема в макете xml заключалась в том, что вы не использовали вес / процент, поэтому контент выходит за пределы экрана.