1
캐스트. 내가 android.app.AlertDialog
을 사용한다면 충돌이 없지만 대화 상자가 재료 스타일이 아닙니다.에 AlertDialog 클래스 내가</p> <blockquote> <p>setView (보기)의 AlertDialog</p> </blockquote> <p>방법을 사용하는 경우 다음 내가 클래스 캐스트 옵션을 얻을 예외
public class SearchFilterFragment extends DialogFragment {
boolean isAscending;
CheckBox checkbox;
View view;
SearchFilterInterface searchFilterInterface = null;
int which_one;
int array_id;
public interface SearchFilterInterface {
void onSelect(int which, boolean asc);
}
public static SearchFilterFragment newInstance(@ArrayRes int array_id) {
Bundle args = new Bundle();
args.putInt(GiantBomb.ARRAY,array_id);
SearchFilterFragment fragment = new SearchFilterFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
searchFilterInterface = (SearchFilterInterface) getTargetFragment();
} catch (Exception e) {
Toaster.make(getContext(), "interface cast exception");
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
array_id = getArguments().getInt(GiantBomb.ARRAY);
if (array_id==R.array.search_filter) {
which_one = SharedPreference.getFromSharedPreferences(GiantBomb.WHICH, 4, getContext());
isAscending = SharedPreference.getFromSharedPreferences(GiantBomb.ASCENDING, true, getContext());
}else {
which_one = SharedPreference.getFromSharedPreferences(GiantBomb.SORT_WHICH,1,getContext());
isAscending = SharedPreference.getFromSharedPreferences(GiantBomb.SORT_ASCENDING,true,getContext());
}
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
view = getActivity().getLayoutInflater().inflate(R.layout.search_option_layout,null);
checkbox = (CheckBox) view.findViewById(R.id.checkbox);
final int uncheck_color = ContextCompat.getColor(getContext(),R.color.black_white);
checkbox.setChecked(!isAscending);
if (!checkbox.isChecked()) { checkbox.setTextColor(uncheck_color) ;}
final AlertDialog dialog = new AlertDialog.Builder(getContext(),R.style.MyDialogTheme)
.setCancelable(true)
.setTitle("Sort result")
.setSingleChoiceItems(getResources().getStringArray(array_id), which_one, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
which_one = which;
}
})
//crashes here if i use v7 AlertDialog class
.setView(view)
}).create();
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialogInterface) {
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(getContext(),R.color.primary));
}
});
return dialog;
}
}
내 사용자 지정보기
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="20dp"
>
<CheckBox android:id="@+id/checkbox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Descending"
android:textColor="?android:attr/textColorPrimary"
android:theme="@style/MyCheckBox"
android:drawableLeft="@android:color/transparent"
android:drawableStart="@android:color/transparent"
android:drawablePadding="20dp"
style="?android:attr/textAppearanceMedium"
/>
</FrameLayout>
MyDialogTheme
<style name="MyDialogTheme" parent="Theme.AppCompat.DayNight">
<!--item RadioButton or CheckBox color-->
<item name="colorControlNormal">@color/black_white</item>
<item name="colorControlActivated">@color/accent</item>
<!--item text color-->
<item name="textColorAlertDialogListItem">?android:attr/textColorPrimary</item>
<!--buttons color-->
<item name="colorAccent">@color/accent</item>
<!--title and message color-->
<item name="android:textColor">?android:attr/textColorPrimary</item>
<item name="android:background">@color/cardColor</item>
</style>
스택 추적
java.lang.ClassCastException: android.support.v7.widget.LinearLayoutCompat$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams
at android.support.v7.app.AlertController.setupCustomContent(AlertController.java:655)
at android.support.v7.app.AlertController.setupView(AlertController.java:463)
at android.support.v7.app.AlertController.installContent(AlertController.java:226)
at android.support.v7.app.AlertDialog.onCreate(AlertDialog.java:257)
at android.app.Dialog.dispatchOnCreate(Dialog.java:361)
at android.app.Dialog.show(Dialog.java:262)
at android.support.v4.app.DialogFragment.onStart(DialogFragment.java:418)
at android.support.v4.app.Fragment.performStart(Fragment.java:2215)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1340)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:757)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2355)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2146)
at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2098)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2008)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:710)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5113)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612)
at dalvik.system.NativeStart.main(Native Method)
''AppCompat' 테마를 귀하의 MyDialogTheme' 있습니까? 즉, 그것의 부모는'AppCompat' 테마입니까? –
예. AppCompat 테마입니다. XML을 추가했습니다. – randy
네, 근원을 더 자세히 보았습니다. 원인으로는 이해가 가지 않습니다. 내가 코드를 올바르게 따르는 경우, 이것은 실제로 그 부분에 멍청한 것처럼 보입니다. 'AlertDialog'가'ListView'를 가질 때'LayoutParams'를'LinearLayout.LayoutParams'으로 형변환하여 커스텀'View' 컨테이너의'weight'을 수정하려고 시도하지만 컨테이너는'LinearLayoutCompat'에 있습니다. 당신은'ClassCastException'을 얻는다. 어쩌면 커스텀'View'와리스트를 허용 할 의도가 없었던 것일까?'AlertDialog' 플랫폼에서 작동한다는 것은 단지 운이 좋은가? 말하자면, 그런 식으로 사용한 적은 없습니다. –