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

В моем фрагменте мне нужно добавить кнопку обновления на панель действий, если сеть недоступна.

Например:

    private void beginRetriveData() {

            final StringBuilder Request = "some_url_here"

            if(!isNetworkAvailable()) {     

                Toast.makeText(getSherlockActivity(), "No active internet connection", Toast.LENGTH_LONG).show(); 
// I NEED TO ADD REFRESH BUTTON TO ACTIONBAR    

            } else {
                     //AsyncTasc here

            }   
        }

Какой лучший способ сделать это?

Я пробовал следующее:

public MenuItem mRefreshMenuItem;

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu items for use in the action bar
        getSupportMenuInflater().inflate(R.menu.main, menu);

        mRefreshMenuItem = menu.findItem(R.id.navigation_refresh);
        mRefreshMenuItem.setVisible(false);

        return true;
    }

    @Override
    public void onNetworkUnavailable()
    {
        mRefreshMenuItem.setVisible(true); //ERROR HERE 
    }

Затем во Фрагменте я позвонил:

 if(getActivity() instanceof FragmentsHolderActivity){
      FragmentsHolderActivity myactivity = (FragmentsHolderActivity) activity;
      myactivity.onNetworkUnavailable();
 }

но когда я вызываю onNetworkUnavailable(), возникает исключение NullPointerException.


person Sever    schedule 03.11.2013    source источник
comment
Создайте обратный вызов для своей активности, вот пример: stackoverflow.com/questions/14213947/   -  person cYrixmorten    schedule 04.11.2013


Ответы (1)


Переопределите onCreateOptionsMenu() в своей деятельности и добавьте обновление MenuItem в меню (вы можете сделать это, наполнив ресурс меню или создав экземпляр программно). Затем сделайте элемент обновления невидимым и сохраните его как переменную экземпляра для последующего доступа.

Добавьте в свою активность:

private MenuItem mRefreshMenuItem;

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // add your refresh button to res/menu/main.xml
    getMenuInflater().inflate(R.menu.main, menu);

    mRefreshMenuItem = menu.findItem(R.id.refresh);
    mRefreshMenuItem.setVisible(false);

    return true;
}

Затем добавьте интерфейс, чтобы ваш фрагмент мог сообщать вашей активности о возникновении сетевой ошибки, как описано в Взаимодействие с другими фрагментами.

Добавьте к своему фрагменту:

private OnNetworkUnavailableListener mListener;

public interface OnNetworkUnavailableListener
{
    public void onNetworkUnavailable();
}

@Override
public void onAttach(Activity activity)
{
    super.onAttach(activity);
    try
    {
        mListener = (OnNetworkUnavailableListener)activity;
    }
    catch (ClassCastException ex)
    {
        throw new ClassCastException(activity.getClass().getSimpleName() + " must implement OnNetworkUnavailableListener");
    }
}

Кроме того, вызовите метод на своем интерфейсе, когда сеть недоступна:

private void beginRetriveData()
{
    ...
    if(!isNetworkAvailable())
    {     
        mListener.onNetworkUnavailable();
    }
    ...
}

Наконец, реализуйте свой интерфейс в действии и установите видимость MenuItem как видимую при возникновении сетевой ошибки. Не забудьте добавить «реализует OnNetworkUnavailableListener» в свою активность.

public class MainActivity extends Activity implements OnNetworkUnavailableListener
{
    ...

    @Override
    public void onNetworkUnavailable()
    {
        mRefreshMenuItem.setVisible(true);
    }
}
person jhotovy    schedule 03.11.2013
comment
Спасибо. Но не работа. Ошибка (NullPointerException) произошла, когда я вызываю mListener.onNetworkUnavailable() в строке с mRefreshMenuItem.setVisible(true); - person Sever; 04.11.2013
comment
В вашем обновленном примере вы можете вызывать onNetworkUnavailable() до вызова onCreateOptionsMenu(). Когда вы вызываете onNetworkUnavailable()? - person jhotovy; 04.11.2013
comment
@onCreateOptionsMenu, вы правы, onCreateOptionsMenu вызывается после oncreate(), а мой фрагмент вызывается при oncreate. Итак, моя проблема заключается в вызове фрагмента после onCreateOptionsMenu. Но я не знаю как. - person Sever; 04.11.2013
comment
Попробуйте вызвать его в onStart() вместо onCreate(). - person jhotovy; 04.11.2013