【问题标题】:Android Fragment Change TitleAndroid 片段更改标题
【发布时间】:2015-03-11 04:56:23
【问题描述】:

我的片段有问题。基本上,我有一个应用程序,它有一个导航抽屉和 4 个活动按钮。当每个按钮被按下时,它将显示另一个片段。我遇到的问题是我想在ActionBar 上显示正确的标题。我可以在ActionBar 上显示从导航中选择的项目。但是当我按下按钮转到另一个片段时,我无法在ActionBar 上显示标题。有什么想法吗?

这是我的示例代码: HomeActivity.class

 private void displayView(final int position) {
    // update the main content by replacing fragments
    Fragment fragment = null;
    switch (position) {
        case 0:
            fragment = new HomeFragment();
            break;
        case 1:
            fragment = new MyProfileFragment();
            break;
        case 2:
            fragment = new AboutFragment();
            break;
        default:
            break;
    }

    if (fragment != null) {
        fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.frame_container, fragment).commit();

        // update selected item and title, then close the drawer
        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);
        setTitle(navMenuTitles[position]);
        drawer.closeDrawer(mDrawerList);
    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }

}

HomeFragment:

public class HomeFragment extends Fragment {

public HomeFragment() {
}

CardView card_cart, card_scan, card_categories, card_about;
Intent i;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_home, container, false);
    initControls(rootView);
    return rootView;
}

private void initControls(View rootView) {

    card_cart = (CardView) rootView.findViewById(R.id.card_cart);
    card_scan = (CardView) rootView.findViewById(R.id.card_scan);
    card_categories = (CardView) rootView.findViewById(R.id.card_categories);
    card_about = (CardView) rootView.findViewById(R.id.card_about);

    card_categories.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            i = new Intent(getActivity(), CategoriesActivity.class);
            startActivity(i);
        }
    });

    card_cart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            MyCartFragment nextFrag = new MyCartFragment();
            getFragmentManager().beginTransaction()
                    .replace(R.id.frame_container, nextFrag)
                    .addToBackStack(null)
                    .commit();
        }
    });

    card_about.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AboutGrabHutFragment aboutFrag = new AboutGrabHutFragment();
            getFragmentManager().beginTransaction()
                    .setBreadCrumbTitle(getResources().getString(R.string.about))
                    .replace(R.id.frame_container, aboutFrag)
                    .addToBackStack(null)
                    .commit();


        }
    });

    card_scan.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            i = new Intent(getActivity(), ScanActivity.class);
            startActivity(i);
        }
    });

}

HomeFragment 中会找到这4 个按钮。单击按钮时,将转到另一个片段。我可以用这个来显示:

card_about.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AboutGrabHutFragment aboutFrag = new AboutGrabHutFragment();
            getFragmentManager().beginTransaction()
                    .setBreadCrumbTitle(getResources().getString(R.string.about))
                    .replace(R.id.frame_container, aboutFrag)
                    .addToBackStack(null)
                    .commit();
            getActivity().setTitle("About");

        }
    });

但是问题是我回去的时候,标题还是About

【问题讨论】:

标签: android android-fragments


【解决方案1】:

在所需片段的 onCreateView() 方法上,调用 Main Activity 的 setTitle("") 方法。这样您就不需要检查后按事件。

这对我有用

例如***

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.id.your_fragment_layout, container,
                false);
        getActivity().setTitle("Your actionbar title");

        return rootView;
    }

更新:

您可以通过覆盖onResume 方法来更改标题。并且为了安全起见,您还可以覆盖setUserVisibleHint 并在片段isVisibleToUser 时更改标题。

【讨论】:

  • 如果将片段添加到 BackStack,此解决方案将不起作用。
【解决方案2】:

如果有人使用 Kotlin 并且 @Sachin Rao 答案不起作用(就像我的情况一样)我做了扩展功能来更改标题:

fun Fragment.setActivityTitle(@StringRes id: Int) {
    (activity as AppCompatActivity?)?.supportActionBar?.title = getString(id)
}

fun Fragment.setActivityTitle(title: String) {
    (activity as AppCompatActivity?)?.supportActionBar?.title = title
}

用法(片段中的任何点):

setActivityTitle(R.string.title)
setActivityTitle("Title")

【讨论】:

    【解决方案3】:

    我在 MainActivity 中使用了一个 onBackStackChangedListener,并在您在应用程序中导航时使用它来更新各种内容。您已经在手动更改标题,因此请尝试以下操作:

    //manager is my FragmentManager
    manager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
                //I'm using this check to check if i'm on my MainFragment, you can use this in al kinds of ways. Decide yourself if you use it or not.
                if (manager.getBackStackEntryCount() == 1) {
                    Class<? extends Fragment> FragClass;
                    //mCurrentFragment is my global Fragment variable to do and check stuff with as below.
                    FragClass = mCurrentFragment.getClass();
                    if ((FragClass == DesiredFragment.class)) {
                        this.setTitle("desired title");
                    } else if ((FragClass == OtherDesiredFragment.class)) {
                        //hope this helps.
                    } //etc..
                }
            }
        });
    @Override
    public void onBackPressed() {
    // TODO Auto-generated method stub
        try {
            Class<? extends Fragment> FragClass;
            FragClass = mCurrentFragment.getClass();
            if ((FragClass == HomeFragment.class)) {
                System.exit(0);
            }
                popFragment();
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    }
    
    public void popFragment() {
        try {
            if (manager.getBackStackEntryCount() > 1) {
                manager.popBackStack();
                manager.executePendingTransactions();
                ArrayList<Fragment> reversedFragments = new ArrayList<Fragment>(manager.getFragments());
                Collections.reverse(reversedFragments);
                for (Fragment fragment : reversedFragments) {
                    if (fragment != null) {
                        try {
                            mCurrentFragment = (BaseFragment) fragment;
                        } catch (ClassCastException e) {
                            e.printStackTrace();
                        }
                        break;
                    }
                }
            } else {
                finish();
            }
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    }
    

    【讨论】:

    • 试过这样做,但是当我回去时,它并没有改变标题
    • 你有@Override OnBackPressed 函数吗,你在按下后退的时候处理backstack吗?
    • 检查更新的答案,它在按下后退按钮时控制后退堆栈。 BaseFragment 是我的 Fragment 的自定义类,所以在你的情况下它可能是 Fragment。
    • @bEtTy Barnes 这对您有帮助/还是您找到了其他解决方案?
    猜你喜欢
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    相关资源
    最近更新 更多