2015-10-30 5 views
1

Явно новичок как в Java, так и в Android Studio, большая часть моего кода взята из учебников и, как таковая, я, возможно, не полностью ее понимаю, хотя я стараюсь У меня есть некоторый уровень понимания того, что я кодирую.Java (Android Studio) - Невозможно использовать LocalBroadcastManager.getInstance (this)

Поэтому я пытаюсь использовать фрагмент DatePicker, чтобы выбрать дату, а затем установить текстовое поле на выбранную дату. Для того, чтобы отправить строку выбранной даты к MainActivity Я пытаюсь использовать LocalBroadCastManager, используя учебники, я создал приемник вещания в MainActivity, и я пытаюсь отправить трансляцию из моего фрагмента, однако линии

LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 

в моем фрагменте класс подчеркнут с ошибкой

«ошибка: (51, 30) ошибка: метод деЫпзЬапсе в классе LocalBroadcastManager не может быть применен к данным типам; требуемой: Контекстное найдено: CalendarDatePickerFragment причины: фактический аргумент CalendarDatePickerFragment не может преобразовываться в контекст посредством обращения к вызову метода on "

Я попытался заменить« это »на несколько других вещей, например« Контекст », однако все они дают мне ошибки. Вот все, что мой код минус импорт:

MainActivity:

public class MainActivity extends ActionBarActivity implements    
View.OnClickListener { 

TextView mainTextView; 
Button mainButton; 
EditText inputbox; 
static String DateInput; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mainTextView = (TextView) findViewById(R.id.main_textview); 
    mainTextView.setText("Set in Java!"); 
    mainButton = (Button) findViewById(R.id.TimeInpButton); 
    mainButton.setOnClickListener(this); 
    inputbox = (EditText) findViewById(R.id.inputBox); 
    // Register to receive messages. We are registering an observer (mMessageReceiver) to receive Intents with actions named "custom-event-name". 
    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, 
      new IntentFilter("set-date")); 
} 

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // Get extra data included in the Intent 
     String setdate = intent.getStringExtra("input-date"); 
     Log.d("receiver", "Got message: " + setdate); 
     inputbox.setText(setdate); 
    } 
}; 

@Override 
protected void onDestroy() { 
    // Unregister since the activity is about to be closed. 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); 
    super.onDestroy(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 


@Override 
public void onClick(View v) { 
    DialogFragment DatePickerFrag = new CalendarDatePickerFragment(); 
    DatePickerFrag.show(getSupportFragmentManager(), "datePicker"); 


} 
} 

CalendarDatePickerFragment:

public class CalendarDatePickerFragment extends DialogFragment implements 
DatePickerDialog.OnDateSetListener { 



@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    final Calendar calendar = Calendar.getInstance(); 
    int yy = calendar.get(Calendar.YEAR); 
    int mm = calendar.get(Calendar.MONTH); 
    int dd = calendar.get(Calendar.DAY_OF_MONTH); 
    return new DatePickerDialog(getActivity(), this, yy, mm, dd); 
} 

public void onDateSet(DatePicker view, int yy, int mm, int dd) { 
    String compileddate = (dd+" "+mm+" "+yy); 
    Log.d("sender", "Broadcasting message"); 
    Intent intent = new Intent("set-date"); 
    // You can also include some extra data. 
    intent.putExtra("input-date", compileddate); 
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
} 

} 

Извините, если я усложненной очень простой вопрос, я чувствовал, что это было возможно, я мог бы делать что-то неправильно в более широких масштабах, поэтому я подумал, что было бы неплохо дать понять, что я пытаюсь добиться.

Благодарим за помощь, которую вы можете предоставить.

ответ

3

Error:(51, 30) error: method getInstance in class LocalBroadcastManager cannot be applied to given types; required: Context found: CalendarDatePickerFragment reason: actual argument CalendarDatePickerFragment cannot be converted to Context by method invocation conversion

да, все правильно. Fragment не наследует от Context, а Activity. Вот почему вы можете использовать это в Activity, но не в подклассе DialogFragment. Используйте getActivity(), в подклассе DialogFragment

LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent); 
+0

Это сработало, спасибо тонну. Я не думаю, что вы могли бы точно объяснить, что делает это «getActivity()»? – Fyrefly

+0

getActivity() возвращает действие, в котором размещен фрагмент. – Blackbelt

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