0

Для моего приложения я хочу, чтобы мой пользователь мог нажать кнопку «Изменить пользователя», включить всплывающее окно, взять текстовый ввод, а затем сохранить в общих настройках после выхода, вернуться к активности, вызванный из.Как создать всплывающий Android-фрагмент, который принимает текстовый ввод, прежде чем возвращаться к моему основному действию?

Я бы хотел, чтобы моя методология была похожа на фрагмент TimePicker, который я уже реализовал, и я отправлю его в конце этого.

настоящее время я использую этот учебник в качестве руководства: Dialog Fragment Tutorial

Вот мой диалог Фрагмент Класс:

public class EditNameDialog extends DialogFragment { 

    private EditText mEditText; 

    public EditNameDialog() { 
     // Empty constructor required for DialogFragment 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_edit_name, container); 
     getDialog().setTitle("Hello"); 
     return view; 
    } 

    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
     return true; 

    } 
} 

Вот мой MainActivity, что называет его:

public class MainActivity extends Activity implements 
     TimePickerFragment.FragmentCallbacks { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Use the current time as the default values for the picker 
     SharedPreferences sharedPref = this.getSharedPreferences("prediction", 
       Context.MODE_PRIVATE); 

     final Calendar c = Calendar.getInstance(); 
     int defaultHour = c.get(Calendar.HOUR_OF_DAY); 
     int defaultMinute = c.get(Calendar.MINUTE); 

     int hour = sharedPref.getInt("prediction_hour", defaultHour); 
     int minute = sharedPref.getInt("prediction_min", defaultMinute); 

     String timeString = Integer.toString(hour) + ":" 
       + Integer.toString(minute); 

     TextView predictionText = (TextView) findViewById(R.id.prediction_time); 
     predictionText.setText(timeString); 
    } 

    public void showTimePickerDialog(View v) { 
     DialogFragment newFragment = new TimePickerFragment(); 
     newFragment.show(getFragmentManager(), "timePicker"); 

    } 

    public void showUserNameEdit(View c) { 
     EditNameDialog newFragment = new EditNameDialog(); 
     newFragment.show(getSupportFragmentManager(), "editName"); 
    } 

    @Override 
    public void TimeUpdated(int hour, int minute) { 
     Toast.makeText(this, "Hour: " + hour + " Minute: " + minute, 
       Toast.LENGTH_SHORT).show(); 
     // finish(); 
     // startActivity(new Intent(this, MainActivity.class)); 

     String timeString = Integer.toString(hour) + ":" 
       + Integer.toString(minute); 
     TextView predictionText = (TextView) findViewById(R.id.prediction_time); 
     predictionText.setText(timeString); 
    } 
} 

Я считаю, что это проблема. Либо я вызываю show() с getFragmentManager(), и говорит, что show() принимает только getSupportFragmentManager(), или я вызываю его с помощью getSupportFragmentManager(), и он говорит, что у Activity нет этого метода. Я знаю, что я мог бы расширить свою деятельность с помощью FragmentActivity, но это создает другие проблемы. Я хотел бы назвать это как мой TimePickerFragment, как показано ниже:

public class TimePickerFragment extends DialogFragment implements 
     TimePickerDialog.OnTimeSetListener { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // Use the current time as the default values for the picker 
     Context context = getActivity(); 
     SharedPreferences sharedPref = context.getSharedPreferences(
       "prediction", Context.MODE_PRIVATE); 

     final Calendar c = Calendar.getInstance(); 
     int defaultHour = c.get(Calendar.HOUR_OF_DAY); 
     int defaultMinute = c.get(Calendar.MINUTE); 

     int hour = sharedPref.getInt("prediction_hour", defaultHour); 
     int minute = sharedPref.getInt("prediction_min", defaultMinute); 

     // Create a new instance of TimePickerDialog and return it 
     return new TimePickerDialog(getActivity(), this, hour, minute, 
       DateFormat.is24HourFormat(getActivity())); 
    } 

    public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
     Context context = getActivity(); 
     SharedPreferences sharedPref = context.getSharedPreferences(
       "prediction", Context.MODE_PRIVATE); 
     SharedPreferences.Editor editorh = sharedPref.edit(); 
     editorh.putInt("prediction_hour", hourOfDay); 
     editorh.commit(); 
     SharedPreferences.Editor editorm = sharedPref.edit(); 
     editorm.putInt("prediction_min", minute); 
     editorm.commit(); 
     mCallbacks.TimeUpdated(hourOfDay, minute); 
    } 

    /** 
    * Interface 
    */ 
    private FragmentCallbacks mCallbacks; 

    public interface FragmentCallbacks { 
     void TimeUpdated(int hour, int minute); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mCallbacks = (FragmentCallbacks) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(
        "Activity must implement Fragment Two."); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mCallbacks = null; 
    } 

} 
+0

Либо использовать версию поддержки на DialogFragment с FragmentActivity (или AppCompatActivity), или использовать оригинальная версия с активностью. – Egor

+0

@Egor Не могли бы вы расширить это для меня? –

ответ

0

Я предлагаю остаться уточненным с последней поддержкой библиотек, так что ваше приложение использует новейшие конструкции пользовательского интерфейса (Material Design) и на всех устройствах ваше приложение будет сохранять одинаковый внешний вид. Поэтому я предлагаю сделать следующее:

Для DialogFragments вам необходимо передать аргументы, чтобы начать новый экземпляр вашего фрагмента, вместо использования общих настроек. Хотя общие предпочтения все еще работают, это не очень идеальное решение. Ниже приведены методы, используемые для передачи аргументов фрагменту диалога с помощью метода newInstance(). Причина, по которой не передавать аргументы конструктору можно найтиhere

Используйте AppCompatDialog в onCreateDialog, а также использование импорт ниже:

import android.support.v4.app.DialogFragment; 
import android.support.v7.app.AlertDialog; 
import android.support.v7.app.AppCompatDialog; 

... 
... 

public class TimePickerFragment extends DialogFragment implements 
    TimePickerDialog.OnTimeSetListener { 

public static TimePickerFragment newInstance(int hour, int min){ 
    TimePickerFragment frag = new TimePickerFragment(); 
    Bundle args = new Bundle(); 
    args.putInt("hour", hour); 
    args.putInt("min", min); 
    frag.setArguements(args); 
    return frag; 
} 

@Override 
public AppCompatDialog onCreateDialog(Bundle savedInstanceState) { 

    // Use the current time as the default values for the picker 
    final Calendar c = Calendar.getInstance(); 
    int defaultHour = c.get(Calendar.HOUR_OF_DAY); 
    int defaultMinute = c.get(Calendar.MINUTE); 

    int hour = getArguments().getInt("hour"); 
    int minute = getArguments().getInt("min"); 

    // Create a new instance of TimePickerDialog and return it 
    return new TimePickerDialog(getActivity(), this, hour, minute, 
      DateFormat.is24HourFormat(getActivity())); 
} 

    ... 
    ... 
} 

И когда вы показываете это сделать следующее :

TimePickerFragment.newInstance(hour, min).show(getSupportFragmentManager(), "time_fragment"); 

И в своей деятельности должны распространяться AppCompatActivity нравится следующим образом:

public class MainActivity extends AppCompatActivity implements 
    TimePickerFragment.FragmentCallbacks { 

Затем в вашей деятельности используйте getSupportFragmentManager() при вызове show();

Если у вас нет последней поддержку библиотек, загруженных с приложением, добавьте эту зависимость в свой Gradle файл:

dependencies { 
    compile 'com.android.support:appcompat-v7:22.1.1' 
    compile 'com.android.support:support-v4:22.1.1' 
    ... 
} 
+0

Это прекрасно, спасибо! Если у вас есть время, не могли бы вы рассказать мне, насколько я близка к лучшей практике? Я привык к iOS dev, и моя нынешняя методология кажется взломанной. –

+0

Для лучшей практики с пользовательским интерфейсом следуйте принципам дизайна Google проповедует разработчикам: http://www.google.com/design/spec/components/dialogs.html # dialogs-confirm-dialogs, при разработке новой части в вашем приложении просмотрите это и убедитесь, что вы следуете принципам. Что касается не-пользовательского интерфейса, я отредактирую свой ответ, чтобы добавить, как это сделать лучше всего. –

+0

Отредактировано, как наилучшим образом использовать DialogFragments, и избегать использования общих привилегий, как вы делали. Полужирный и выделены курсивом изменения –

Смежные вопросы