Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
mcGurov
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 99
#1

Как переделать Activity в фрагмент? - Программирование Android

27.12.2013, 10:02. Просмотров 851. Ответов 4
Метки нет (Все метки)

Есть своё приложение реализованное с помощью фрагментов. Решил добавить в него простейшую напоминалку TaskReminder, стал переделывать Activity в Fragment и столкнулся с рядом проблем, большинство удалось решить, но никак не могу исправить главную активность.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
package planner;
 
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
 
import com.example.navigationsample.R;
 
import android.app.Activity;
 
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TimePicker;
import android.widget.Toast;
 
public class ReminderEditFragment extends Fragment {
 
    // 
    // Dialog Constants
    //
    private static final int DATE_PICKER_DIALOG = 0;
    private static final int TIME_PICKER_DIALOG = 1;
    
    // 
    // Date Format 
    //
    private static final String DATE_FORMAT = "yyyy-MM-dd"; 
    private static final String TIME_FORMAT = "kk:mm";
    public static final String DATE_TIME_FORMAT = "yyyy-MM-dd kk:mm:ss";
    
    private EditText mTitleText;
    private EditText mBodyText;
    private Button mDateButton;
    private Button mTimeButton;
    private Button mConfirmButton;
    private Long mRowId;
    private RemindersDbAdapter mDbHelper;
    private Calendar mCalendar;  
    
    
    
 
    @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    final View v = inflater.inflate(R.layout.reminder_edit, container, false);
        
        mDbHelper = new RemindersDbAdapter(getActivity());
        
        
        mCalendar = Calendar.getInstance(); 
        mTitleText = (EditText) v.findViewById(R.id.title);
        mBodyText = (EditText) v.findViewById(R.id.body);
        mDateButton = (Button) v.findViewById(R.id.reminder_date);
        mTimeButton = (Button) v.findViewById(R.id.reminder_time);
      
        mConfirmButton = (Button) v.findViewById(R.id.confirm);
       
        mRowId = savedInstanceState != null ? savedInstanceState.getLong(RemindersDbAdapter.KEY_ROWID) 
                                            : null;
      
        registerButtonListenersAndSetDefaultText();
        return v;
    }
 
    private void setRowIdFromIntent()  {
        if (mRowId == null) {
            Bundle extras = getIntent().getExtras();            
            mRowId = extras != null ? extras.getLong(RemindersDbAdapter.KEY_ROWID) 
                                    : null;
            
        }
    }
    
   
 
    @Override
    public void onPause() {
        super.onPause();
        mDbHelper.close(); 
    }
    
    @Override
    public void onResume() {
        super.onResume();
        mDbHelper.open(); 
        setRowIdFromIntent();
        populateFields();
    }
    
    protected Dialog onCreateDialog(int id) {
        switch(id) {
            case DATE_PICKER_DIALOG: 
                return showDatePicker();
            case TIME_PICKER_DIALOG: 
                return showTimePicker(); 
        }
        return onCreateDialog(id);
    }
    
    private DatePickerDialog showDatePicker() {
        
        
        DatePickerDialog datePicker = new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() {
            
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                mCalendar.set(Calendar.YEAR, year);
                mCalendar.set(Calendar.MONTH, monthOfYear);
                mCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
                updateDateButtonText(); 
            }
        }, mCalendar.get(Calendar.YEAR), mCalendar.get(Calendar.MONTH), mCalendar.get(Calendar.DAY_OF_MONTH)); 
        return datePicker; 
    }
 
   private TimePickerDialog showTimePicker() {
        
        TimePickerDialog timePicker = new TimePickerDialog(getActivity(), new TimePickerDialog.OnTimeSetListener() {
            
            @Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                mCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
                mCalendar.set(Calendar.MINUTE, minute); 
                updateTimeButtonText(); 
            }
        }, mCalendar.get(Calendar.HOUR_OF_DAY), mCalendar.get(Calendar.MINUTE), true); 
        
        return timePicker; 
    }
    
    private void registerButtonListenersAndSetDefaultText() {
 
        mDateButton.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                showDialog(DATE_PICKER_DIALOG);  
            }
        }); 
        
        
        mTimeButton.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                showDialog(TIME_PICKER_DIALOG); 
            }
        }); 
        
        mConfirmButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                saveState(); 
                
                Toast.makeText(getActivity(), getString(R.string.task_saved_message), Toast.LENGTH_SHORT).show();
            
                  return;
            }
          
        });
        
          updateDateButtonText(); 
          updateTimeButtonText();
    }
   
    private void populateFields()  {
        
    
        
        // Only populate the text boxes and change the calendar date
        // if the row is not null from the database. 
        if (mRowId != null) {
            Cursor reminder = mDbHelper.fetchReminder(mRowId);
            startManagingCursor(reminder);
            mTitleText.setText(reminder.getString(
                    reminder.getColumnIndexOrThrow(RemindersDbAdapter.KEY_TITLE)));
            mBodyText.setText(reminder.getString(
                    reminder.getColumnIndexOrThrow(RemindersDbAdapter.KEY_BODY)));
            
 
            // Get the date from the database and format it for our use. 
            SimpleDateFormat dateTimeFormat = new SimpleDateFormat(DATE_TIME_FORMAT);
            Date date = null;
            try {
                String dateString = reminder.getString(reminder.getColumnIndexOrThrow(RemindersDbAdapter.KEY_DATE_TIME)); 
                date = dateTimeFormat.parse(dateString);
                mCalendar.setTime(date); 
            } catch (ParseException e) {
                Log.e("ReminderEditActivity", e.getMessage(), e); 
            } 
        } else {
            // This is a new task - add defaults from preferences if set. 
            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
            String defaultTitleKey = getString(R.string.pref_task_title_key); 
            String defaultTimeKey = getString(R.string.pref_default_time_from_now_key); 
            
            String defaultTitle = prefs.getString(defaultTitleKey, null);
            String defaultTime = prefs.getString(defaultTimeKey, null); 
            
            if(defaultTitle != null)
                mTitleText.setText(defaultTitle); 
            
            if(defaultTime != null)
                mCalendar.add(Calendar.MINUTE, Integer.parseInt(defaultTime));
            
        }
        
        updateDateButtonText(); 
        updateTimeButtonText(); 
            
    }
 
    private void updateTimeButtonText() {
        // Set the time button text based upon the value from the database
        SimpleDateFormat timeFormat = new SimpleDateFormat(TIME_FORMAT); 
        String timeForButton = timeFormat.format(mCalendar.getTime()); 
        mTimeButton.setText(timeForButton);
    }
 
    private void updateDateButtonText() {
        // Set the date button text based upon the value from the database 
        SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT); 
        String dateForButton = dateFormat.format(mCalendar.getTime()); 
        mDateButton.setText(dateForButton);
    }
    
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putLong(RemindersDbAdapter.KEY_ROWID, mRowId);
    }
    
 
    
    private void saveState() {
        String title = mTitleText.getText().toString();
        String body = mBodyText.getText().toString();
 
        SimpleDateFormat dateTimeFormat = new SimpleDateFormat(DATE_TIME_FORMAT); 
        String reminderDateTime = dateTimeFormat.format(mCalendar.getTime());
 
        if (mRowId == null) {
            
            long id = mDbHelper.createReminder(title, body, reminderDateTime);
            if (id > 0) {
                mRowId = id;
            }
        } else {
            mDbHelper.updateReminder(mRowId, title, body, reminderDateTime);
        }
       
        new ReminderManager(getActivity()).setReminder(mRowId, mCalendar); 
        
        
    }
    
}
Ошибки выдаёт:

81 строка не катит getIntent()
151 и 160 строка ошибка в showDialog (TIME_PICKER_DIALOG)

Не хватает знаний понять что делать дальше, может дело в том, что в TaskRemainder используется устаревший метод программирования?

Кстати кто делает подобное - в решении очень помогает getActivity()
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2013, 10:02     Как переделать Activity в фрагмент?
Посмотрите здесь:

Как удалить activity? - Программирование Android
мне нужно при запуске второго активити(т есть когда его видно) что бы первое уничтожалось но только не завершалась программа ...

Layout как новый Activity - Программирование Android
Здравствуйте, слышал что Layout можно использовать вместо нового Activity, делаю простое приложение что то вроде справочника, так вот там...

Как вернуться в activity в тестах - Программирование Android
В тестах приложения, когда проверяю нажатия на кнопки открывается другая активити. Как вернуться назад? И ещё вопрос, если над методом...

Как сделать такое activity? - Программирование Android
Добрый день. Для начала по прошу держать свои камни при себе да бы они не попали в меня. Так как я начинающий в этом деле человек. Хочу...

Как наследовать класс activity - Программирование Android
Написал класс activity1 в котором программно создан layout1. Как использовать мой класс в новом создаваемом приложении? какой нужен...

Как перейти на главную activity - Программирование Android
как перейти на главную страницу приложения обратно? (с другого активити) <activity android:name=".main.MainActivity" ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
1567 / 1309 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
27.12.2013, 14:56     Как переделать Activity в фрагмент? #2
Цитата Сообщение от mcGurov Посмотреть сообщение
getIntent()
замените на getArguments()

showDialog попробуйте вызвать getActivity().showDialog()

Цитата Сообщение от mcGurov Посмотреть сообщение
устаревший метод программирования
что значит "устаревший метод программирования"?
mcGurov
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 99
27.12.2013, 15:08  [ТС]     Как переделать Activity в фрагмент? #3
Цитата Сообщение от YuraAAA Посмотреть сообщение
что значит "устаревший метод программирования"?
Не правильно выразился,как провильно не знаю, это когда некоторые моменты в коде перечеркнутые, рабочие но рекомендуют использовать более новые...

Добавлено через 1 минуту
А за подсказку спасибо! Вечером попробую и отпишусь!
YuraAAA
1567 / 1309 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
27.12.2013, 15:28     Как переделать Activity в фрагмент? #4
mcGurov, эти методы называются deprecated. Допустим, если вы разрабатываете приложение используя sdk API 17, некоторые методы могут быть deprecated, которые используются на более ранних версиях апи. И попытка запустить приложение на ранних девайсах может вызвать NoSuchMethodError, по-этому, будьте внимательны.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.12.2013, 20:49     Как переделать Activity в фрагмент?
Еще ссылки по теме:

Как закрыть фрагмент? - Программирование Android
Нужно в самом фрагменте завершить его работу и вернуться обратно, как это реализовать

Как закрыть фрагмент - Программирование Android
Есть главное активити в котором с помощью фрагментов показывается разный контент. Типа таба с очень большим числом вкладок. Информация для...

Как вызвать другой activity в android ? - Программирование Android
Как вызвать другой activity в android ??? Добавлено через 1 минуту @Override public void onClick(View v)...

Как изменить переменную в другом Activity? - Программирование Android
Как изменить переменную в другом Activity?

Как связать основную Activity со второй - Программирование Android
Я ещё зеленый в андроид программировании, учусь делать программы с планшета программой AIDE, недавно решил сделать проект с двумя Activity...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
mcGurov
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 99
27.12.2013, 20:49  [ТС]     Как переделать Activity в фрагмент? #5
YuraAAA, получается они необходимы, ведь не плохо же если приложение будет работать и на простых девайсах!

Добавлено через 4 часа 16 минут
Ура!!! Заработало! Спасибо YuraAAA, надеюсь тема кому-нибудь пригодится!

Добавлено через 40 минут
Опять встала проблемма Для класса
Java
1
public class ReminderListFragment extends ListFragment
Не понятен метод
Java
1
 return super.onMenuItemSelected(featureId, item);
в последнем ошибка...

Добавлено через 18 минут
Полный код фрагмента, ошибка в 78 строке
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package planner;
 
 
import com.example.navigationsample.R;
 
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.ListFragment;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.AdapterView.AdapterContextMenuInfo;
 
public class ReminderListFragment extends ListFragment {
    private static final int ACTIVITY_CREATE=0;
    private static final int ACTIVITY_EDIT=1;
    
    private RemindersDbAdapter mDbHelper;
    
    /** Called when the activity is first created. */
    @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    final View v = inflater.inflate(R.layout.reminder_list, container, false);
        
        mDbHelper = new RemindersDbAdapter(getActivity());
        mDbHelper.open();
        fillData();
        registerForContextMenu(getView());
        return v;
 
    }
    
 
    private void fillData() {
        Cursor remindersCursor = mDbHelper.fetchAllReminders();
        getActivity().startManagingCursor(remindersCursor);
        
        // Create an array to specify the fields we want to display in the list (only TITLE)
        String[] from = new String[]{RemindersDbAdapter.KEY_TITLE};
        
        // and an array of the fields we want to bind those fields to (in this case just text1)
        int[] to = new int[]{R.id.text1};
        
        // Now create a simple cursor adapter and set it to display
        SimpleCursorAdapter reminders = 
                new SimpleCursorAdapter(getActivity(), R.layout.reminder_row, remindersCursor, from, to);
        setListAdapter(reminders);
    }
    
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu, null);
        MenuInflater mi = getActivity().getMenuInflater();
        mi.inflate(R.menu.list_menu, menu); 
        return true;
    }
 
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        switch(item.getItemId()) {
        case R.id.menu_insert: 
            createReminder();
            return true; 
        case R.id.menu_settings: 
            Intent i = new Intent(getActivity(), TaskPreferences.class); 
            startActivity(i); 
            return true;
        }
       
        return super.onMenuItemSelected(featureId, item);
    }
    
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        MenuInflater mi = getActivity().getMenuInflater(); 
        mi.inflate(R.menu.list_menu_item_longpress, menu); 
    }
 
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch(item.getItemId()) {
        case R.id.menu_delete:
            AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
            mDbHelper.deleteReminder(info.id);
            fillData();
            return true;
        }
        return super.onContextItemSelected(item);
    }
    
    private void createReminder() {
        Intent i = new Intent(getActivity(), ReminderEditFragment.class);
        startActivityForResult(i, ACTIVITY_CREATE);
    }
    
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Intent i = new Intent(getActivity(), ReminderEditFragment.class);
        i.putExtra(RemindersDbAdapter.KEY_ROWID, id);
        startActivityForResult(i, ACTIVITY_EDIT); 
    }
 
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        fillData();
    }
}
Yandex
Объявления
27.12.2013, 20:49     Как переделать Activity в фрагмент?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru