Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在容器上更改主题后使用ListView刷新片段_Android_Android Fragments - Fatal编程技术网

Android 在容器上更改主题后使用ListView刷新片段

Android 在容器上更改主题后使用ListView刷新片段,android,android-fragments,Android,Android Fragments,我正在开发一个应用程序,它使用Twitter API。我用Android Studio添加了一个导航抽屉活动,里面有一个推文列表视图。我有另一个用于设置活动的活动,用户可以在该活动上选择主题 我遇到的问题是,当用户更改设置并按下后退按钮时,容器的主题会更改,但包含列表视图的片段不会更改。直到我重新启动应用程序,正确的主题才会应用到片段 但是,如果我使用操作栏上的后退按钮(向上导航),主题会立即应用 我想提出一种方法,当用户按下后退按钮时,立即再次应用主题(主题实际上已经被切换),到目前为止,这就

我正在开发一个应用程序,它使用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刷新