片段setTitle并设置菜单

时间:2015-03-11 06:10:48

标签: android android-fragments

我想从片段设置活动倾斜和菜单, (下面的代码运行良好,但我正在寻找更好的实现)

在第一步中,我创建了一个interface

public interface IGetDetails {
    public String getTitle();
    public int getMenu();
}

每个片段实现此接口

例如

public class TestFragment extends Fragment implements IGetDetails {

 @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.tes, null);
    }


    @Override
    public String getTitle() {
        return "test Title";
    }

    @Override
    public int getMenu() {
        return R.menu.test;
    }
}

活动 我用堆栈来记录碎片

Stack<Fragment> fragmentStack=new Stack<>();

当用户从一个片段导航到另一个片段时,我将新片段添加到stack.example

            currentFragment=new TestFragment();
            fragmentStack.push(currentFragment);
            fragmentTransaction.add(R.id.bodyFragment, currentFragment);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
            invalidateOptionsMenu();
            setTitle();
onBackpressed

中的

public void onBackPressed() {

        if(getSupportFragmentManager().getBackStackEntryCount()>0){
            FragmentManager manager =getSupportFragmentManager();
            FragmentTransaction trans = manager.beginTransaction();
            trans.remove( fragmentStack.pop());
            trans.commit();
            manager.popBackStack();
            currentFragment=fragmentStack.lastElement();
             setTitle();
            invalidateOptionsMenu();
        }else{
            super.onBackPressed();
        }
    }
活动中的

setTitle方法

public void setTitle() {

        IGetDetails fragment = (IGetDetails) currentFragment;
        if (fragment != null) {
            String title = fragment.getTitle();
            if (title == null || title.equals("")) {
                setTitle(getString(R.string.app_name));
            } else {
                setTitle(title);
            }
        }
    }

4 个答案:

答案 0 :(得分:0)

只需覆盖Fragment Class中的onAttach和onDetach()。

代表前 -

    @Override
public void onDetach() {
    // TODO Auto-generated method stub
    super.onDetach();
    getActionBar().setTitle("My Account");
}

答案 1 :(得分:0)

对于菜单你的片段必须打电话  setHasOptionsMenu(真) 在它的onCreate方法。

然后只需覆盖onCreateOptionsMenuonOptionsItemSelected即可填充菜单并收听点击次数。

要使用getActivity().setTitle()设置标题,请使用onActivityCreated方法:

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    getActivity().setTitle("My Fragment Title");
}

注意:这仅适用于API&gt; = 11

答案 2 :(得分:0)

对于标题,您需要在onStart()中设置标题:

@Override
public void onStart() {
    super.onStart();
        ((FragmentActivity)getActivity()).setTitle();
    }
}

由于每次加载片段时都会调用onStart(),因此您将始终显示当前显示片段的标题。

加载片段的选项菜单:

@Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //if using fragments from support library
        ((FragmentActivity)getActivity()).setTitle();
        //otherwise
        getActivity().setTitle();
    }
}

现在覆盖onCreateOptionsMenu()并加载要在那里显示的菜单。当Android为您提供适当的解决方案时,无需解决方法。

答案 3 :(得分:0)

  1. 用于设置当前片段的标题。

        currentFragment=new TestFragment();
        ...
        setTitle(currentFragment.getTitle());
    

    您只需要在setTitle()体中进行修改以更好地实现它:

    public void setTitle(String title) {
        getActivity().setTitle(title);
    }
    
  2. 对于菜单选项更改,您调用 invalidateOptionsMenu(),它将调用 onPrepareOptionsMenu(),并且您的R.menu.menu将被设置。

  3. 在这种情况下无需修改