Android 在容器上更改主题后使用ListView刷新片段
我正在开发一个应用程序,它使用Twitter API。我用Android Studio添加了一个导航抽屉活动,里面有一个推文列表视图。我有另一个用于设置活动的活动,用户可以在该活动上选择主题 我遇到的问题是,当用户更改设置并按下后退按钮时,容器的主题会更改,但包含列表视图的片段不会更改。直到我重新启动应用程序,正确的主题才会应用到片段 但是,如果我使用操作栏上的后退按钮(向上导航),主题会立即应用 我想提出一种方法,当用户按下后退按钮时,立即再次应用主题(主题实际上已经被切换),到目前为止,这就是我得到的:Android 在容器上更改主题后使用ListView刷新片段,android,android-fragments,Android,Android Fragments,我正在开发一个应用程序,它使用Twitter API。我用Android Studio添加了一个导航抽屉活动,里面有一个推文列表视图。我有另一个用于设置活动的活动,用户可以在该活动上选择主题 我遇到的问题是,当用户更改设置并按下后退按钮时,容器的主题会更改,但包含列表视图的片段不会更改。直到我重新启动应用程序,正确的主题才会应用到片段 但是,如果我使用操作栏上的后退按钮(向上导航),主题会立即应用 我想提出一种方法,当用户按下后退按钮时,立即再次应用主题(主题实际上已经被切换),到目前为止,这就
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode) {
case RETURN_TO_TWEET_LIST:
if (resultCode == RESULT_OK) {
Bundle bundle = data.getExtras();
if (bundle != null) {
boolean themeChanged = bundle.getBoolean(AppConstants.Strings.THEME_CHANGED);
if (themeChanged) {
refreshFragment();
}
}
}
}
super.onActivityResult(requestCode, resultCode, data);
}
private void refreshFragment() {
//TODO: Figure out how to get the list view to refresh when pressing back
}
我觉得问题不在于我的片段代码,因为在一种情况下它的工作方式与我预期的相同,而在另一种情况下则不同
以下是导航抽屉类:
public class CategoryViewSelector extends BaseActivity
implements NavigationDrawerFragment.NavigationDrawerCallbacks {
/**
* Fragment managing the behaviors, interactions and presentation of the navigation drawer.
*/
private NavigationDrawerFragment mNavigationDrawerFragment;
private TwitterFeedFragment currentFragment;
private String fragmentName = "CUSTOM_FRAGMENT";
private CategoryManager categoryManager;
private final int RETURN_TO_TWEET_LIST = 2;
private SettingsManager settingsManager;
/**
* Used to store the last screen title. For use in {@link #restoreActionBar()}.
*/
private CharSequence mTitle;
private String[] drawerItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
categoryManager = new CategoryManager();
setContentView(R.layout.activity_category_view_selector);
mNavigationDrawerFragment = (NavigationDrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
// Set up the drawer.
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
}
@Override
protected void onResume() {
super.onResume();
}
@Override
public void onNavigationDrawerItemSelected(int position) {
//create a fragment object palceholder
TwitterFeedFragment fragment = null;
// update the main content by replacing fragments
//create a bundle object that will be used to pass arguments to the fragment
//such as a category id.
Bundle bundle = new Bundle();
switch(position) {
case 0:
//load all the tweets by default.
bundle.putLong("categoryId", position);
fragment = new TwitterFeedFragment();
fragment.setArguments(bundle);
setCurrentFragment(fragment);
break;
case 1:
Intent intent = new Intent(this, CategoryManagerView.class);
//may have to change this to be for result again, so that you can use the onActivityResult method
//which will prevent refreshing of the fragment.
startActivityForResult(intent, RETURN_TO_TWEET_LIST);
break;
case 2:
Toast.makeText(getApplicationContext(), "Help not yet available", Toast.LENGTH_LONG).show();
break;
default:
openFragmentForCategory(position);
break;
}
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container, currentFragment, fragmentName)
.commitAllowingStateLoss();
}
private void openFragmentForCategory(int position) {
List<Category> categories = categoryManager.getAllCategories();
//there are three default items in the list right now.
//figure out a better way to handle this. Maybe an app constant.
int index = position - 3;
Category selectedCategory = categories.get(index);
long Id = selectedCategory.getId();
Bundle bundle = new Bundle();
TwitterFeedFragment fragment = null;
bundle.putLong("categoryId", Id);
bundle.putString("categoryName", selectedCategory.getCategoryName());
fragment = new TwitterFeedFragment();
fragment.setArguments(bundle);
setCurrentFragment(fragment);
}
/**
* This method attaches a title to the fragment window when an item is clicked. This will also
* require the use of the category names from the category manager.
* @param number
*/
public void onSectionAttached(int number) {
switch (number) {
case 1:
mTitle = getString(R.string.text_category_default_feed);
break;
case 2:
mTitle = "";
break;
case 3:
mTitle = getString(R.string.text_category_help);
break;
}
}
public void restoreActionBar() {
ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setTitle(mTitle);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (!mNavigationDrawerFragment.isDrawerOpen()) {
// Only show items in the action bar relevant to this screen
// if the drawer is not showing. Otherwise, let the drawer
// decide what to show in the action bar.
getMenuInflater().inflate(R.menu.menu_category_view_selector, menu);
restoreActionBar();
return true;
}
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch(id) {
case R.id.action_settings:
Intent intent = new Intent(this, SettingsActivity.class);
startActivityForResult(intent, RETURN_TO_TWEET_LIST);
break;
case R.id.action_refresh:
currentFragment.refreshFeed();
break;
case R.id.action_logout:
TwitterApplication.getRestClient().clearAccessToken();
onBackPressed();
break;
}
return super.onOptionsItemSelected(item);
}
/**
* This is required so that the refreshFeed method of any fragment can be called.
*
* In the future it might make more sense to make an interface.
* @param currentFragment
*/
public void setCurrentFragment(TwitterFeedFragment currentFragment) {
this.currentFragment = currentFragment;
}
@Override
public void onBackPressed() {
Intent intent = new Intent();
setResult(RESULT_OK, intent);
super.onBackPressed();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode) {
case RETURN_TO_TWEET_LIST:
if (resultCode == RESULT_OK) {
Bundle bundle = data.getExtras();
if (bundle != null) {
boolean themeChanged = bundle.getBoolean(AppConstants.Strings.THEME_CHANGED);
if (themeChanged) {
refreshFragment();
}
}
}
}
super.onActivityResult(requestCode, resultCode, data);
}
private void refreshFragment() {
//TODO: Figure out how to get the list view to refresh when pressing back
}
public类CategoryViewSelector扩展了BaseActivity
实现NavigationDrawerFragment.NavigationDrawerCallbacks{
/**
*片段管理导航抽屉的行为、交互和表示。
*/
私人导航抽屉碎片mnavigation抽屉碎片;
私有TwitterFeedFragment-currentFragment;
私有字符串fragmentName=“CUSTOM_FRAGMENT”;
私有类别管理器类别管理器;
私有最终整数返回到TWEET列表=2;
私有设置管理器设置管理器;
/**
*用于存储最后一个屏幕标题。用于{@link#restoreActionBar()}。
*/
私有字符序列mTitle;
私有字符串[]个字符;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
categoryManager=新建categoryManager();
setContentView(R.layout.activity\u category\u view\u selector);
mNavigationDrawerFragment=(导航DrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.navigation\u抽屉);
mTitle=getTitle();
//把抽屉摆好。
mNavigationDrawerFragment.setUp(
R.id.navigation\u抽屉,
(抽屉布局)findViewById(R.id.抽屉布局);
}
@凌驾
受保护的void onResume(){
super.onResume();
}
@凌驾
已选择NavigationDrawerItems上的公共无效(整数位置){
//创建片段对象palceholder
TwitterFeedFragment片段=null;
//通过替换片段更新主要内容
//创建一个bundle对象,该对象将用于向片段传递参数
//例如类别id。
Bundle=新Bundle();
开关(位置){
案例0:
//默认情况下加载所有tweet。
bundle.putLong(“categoryId”,位置);
fragment=新的TwitterFeedFragment();
fragment.setArguments(bundle);
setCurrentFragment(片段);
打破
案例1:
Intent Intent=新Intent(this,CategoryManagerView.class);
//可能必须再次将其更改为for result,以便可以使用onActivityResult方法
//这将阻止刷新片段。
startActivityForResult(意图,返回TWEET列表);
打破
案例2:
Toast.makeText(getApplicationContext(),“帮助尚未可用”,Toast.LENGTH_LONG.show();
打破
违约:
openFragmentForCategory(位置);
打破
}
FragmentManager FragmentManager=getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container、currentFragment、fragmentName)
.commitAllowingStateLoss();
}
私有void openFragmentForCategory(内部位置){
列表类别=categoryManager.getAllCategories();
//现在列表中有三个默认项。
//找出一个更好的方法来处理这个问题。也许是一个应用常量。
int指数=位置-3;
Category selectedCategory=categories.get(索引);
long Id=selectedCategory.getId();
Bundle=新Bundle();
TwitterFeedFragment片段=null;
bundle.putLong(“categoryId”,Id);
bundle.putString(“categoryName”,selectedCategory.getCategoryName());
fragment=新的TwitterFeedFragment();
fragment.setArguments(bundle);
setCurrentFragment(片段);
}
/**
*单击项目时,此方法会将标题附加到片段窗口。这也会
*要求使用类别管理器中的类别名称。
*@param编号
*/
附加的公共无效部分(整数){
开关(编号){
案例1:
mTitle=getString(R.string.text\u category\u default\u feed);
打破
案例2:
mTitle=“”;
打破
案例3:
mTitle=getString(R.string.text\u category\u help);
打破
}
}
public void restoreActionBar(){
ActionBar ActionBar=getSupportActionBar();
actionBar.setNavigationMode(actionBar.NAVIGATION_模式_标准);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setTitle(mTitle);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
如果(!mNavigationDrawerFragment.isDrawerOpen()){
//仅在操作栏中显示与此屏幕相关的项目
//如果抽屉没有显示。否则,让抽屉显示
//决定在动作栏中显示什么。
getMenuInflater().充气(R.menu.menu\u category\u view\u selector,menu);
restoreActionBar();
返回true;
}
返回super.onCreateOptions菜单(菜单);
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
int id=item.getItemId();
开关(id){
案例R.id.action\u设置:
Intent Intent=新Intent(这是setingsactivity.class);
startActivityForResult(意图,返回TWEET列表);
打破
案例R.id.action\u刷新