【问题标题】:Android add button to action bar within fragmentAndroid将按钮添加到片段内的操作栏
【发布时间】:2013-11-03 21:22:38
【问题描述】:

如果网络无法访问,我需要在我的 Fragment 中向我的操作栏添加刷新按钮。

例如:

    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 
    }

然后在 Fragment 中我调用了:

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

但是当我调用 onNetworkUnavailable() 时,出现了 NullPointerException 。

【问题讨论】:

标签: android android-fragments android-actionbar android-fragmentactivity


【解决方案1】:

在您的 Activity 中覆盖 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;
}

接下来,添加一个接口,以便您的 Fragment 可以在发生网络错误时通知您的 Activity,如 Communicating with Other Fragments 中所述。

添加到您的片段:

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();
    }
    ...
}

最后,在 Activity 中实现您的界面,并将 MenuItem 的可见性设置为在网络错误发生时可见。请记住将“implements OnNetworkUnavailableListener”添加到您的 Activity。

public class MainActivity extends Activity implements OnNetworkUnavailableListener
{
    ...

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

【讨论】:

  • 谢谢。但不行。当我使用 mRefreshMenuItem.setVisible(true) 调用 mListener.onNetworkUnavailable() 时发生错误(NullPointerException);
  • 在您更新的示例中,您可能会在调用 onCreateOptionsMenu() 之前调用 onNetworkUnavailable()。你什么时候调用 onNetworkUnavailable()?
  • @onCreateOptionsMenu,你是对的,onCreateOptionsMenu 在 oncreate() 之后调用,而我的片段在 oncreate 中调用。所以我的麻烦是在 onCreateOptionsMenu 之后调用片段。但我不知道怎么做。
  • 尝试在 onStart() 而不是 onCreate() 中调用它。
猜你喜欢
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 2016-05-31
  • 2020-04-28
相关资源
最近更新 更多