Начать действие для результата внутри класса, расширенного из диалогового окна
У меня есть класс dialogpreference с пользовательским представлением внутри него. этот диалог используется для отображения пользовательских звуков уведомлений с несколькими параметрами. у этого также есть возможность выбрать пользовательский звук уведомления телефона по умолчанию. чтобы сохранить это значение, я должен вызвать метод намерения
Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select ringtone for notifications:");
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,RingtoneManager.TYPE_NOTIFICATION);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, (Uri) null);
startActivityForResult( intent, mRequestCode);
но чтобы получить результат внутри onActivityResult
для результата я должен позвонить startActivityForResult
, Но onstartActivity не поддерживается в dialogPreference. Есть ли другой способ реализации startActivityForResult
,
public class RingtonePref extends DialogPreference implements PreferenceManager.OnActivityResultListener {
private View view;
RecyclerView rvRingtone;
RingtonePrefAdapter adapter;
Context context;
int pos;
String chosenRingtone;
int mRequestCode =5;
public RingtonePref(Context context, AttributeSet attrs) {
super(context, attrs);
this.context=context;
}
@Override
protected View onCreateDialogView() {
view= View.inflate(getContext(), R.layout.layout_ringtone_pref,null);
rvRingtone= (RecyclerView)view.findViewById(R.id.rv_ringtone);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(context);
adapter= new RingtonePrefAdapter();
rvRingtone.setLayoutManager(mLayoutManager);
rvRingtone.setAdapter(adapter);
adapter.setData(generateDataList());
RXEventBusUtils.getInstance().getSubject().subscribeOn(AndroidSchedulers.mainThread())
.subscribe(this::onReceiveEvent);
return view;
}
private List<RingtoneList> generateDataList() {
ArrayList<RingtoneList> ringList= new ArrayList<>();
ringList.add(new RingtoneList("Classic", true));
ringList.add(new RingtoneList("Short",false));
ringList.add(new RingtoneList("Sound style",false));
ringList.add(new RingtoneList("Customize",false));
return ringList;
}
private void onReceiveEvent(Object event){
if (event instanceof RingToneSelectionEvent){
pos= ((RingToneSelectionEvent) event).getPosition();
adapter.clearSelection();
adapter.setSelection(((RingToneSelectionEvent) event).getPosition());
}
}
@Override
protected void onBindDialogView(View v) {
super.onBindDialogView(v);
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
String interval = null;
if (positiveResult) {
interval= String.valueOf(pos);
if (callChangeListener(interval)) {
persistString(interval);
}
}
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
return(a.getString(index));
}
@Override
public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK && requestCode == mRequestCode)
{
Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
if (uri != null)
{
this.chosenRingtone = uri.toString();
Toast.makeText(context, "uri "+ chosenRingtone, Toast.LENGTH_SHORT).show();
}
else
{
this.chosenRingtone = null;
}
}
return true;
}
}