【问题标题】:navigation drawer icon animation导航抽屉图标动画
【发布时间】:2014-05-04 12:11:19
【问题描述】:

我开始为 Android 编写应用程序。我对左上角NavigationDrawer 图标的Animation 有疑问。首次启动应用程序时它可以正常工作,但是当我从 NavgationDrawer 的列表中选择一个项目时,即使 `NavigationDrawer 正常关闭,它的图标仍处于“打开”状态。

这是我的MainActivity

import android.app.*;
import android.os.*;
import android.view.*;
import android.widget.*;
import android.app.ActionBar;
import android.os.Bundle;
import android.app.Activity;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.content.res.*;

public class MainActivity extends FragmentActivity {

    ActionBarDrawerToggle icon;
    final String[] listContent ={"Accueil","Fiche technique","Pilotes","Ecuries"};
    final String[] fragments ={
            "com.mycompany.f1holo.MainPageFragment",
            "com.mycompany.f1holo.FirstFragment",
            "com.mycompany.f1holo.SecondFragment",
            "com.mycompany.f1holo.ThirdFragment"};

    private ActionBarDrawerToggle actionBarDrawerToggle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ArrayAdapter<String> ad = new ArrayAdapter<String>(getActionBar().getThemedContext(), android.R.layout.simple_list_item_1, listContent);

        final DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout);
        final ListView list = (ListView) findViewById(R.id.drawer);

        actionBarDrawerToggle = new ActionBarDrawerToggle(
                this,
                drawer,
                R.drawable.navdrawer,
                R.string.open,
                R.string.close);

        drawer.setDrawerListener(actionBarDrawerToggle);

        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        list.setAdapter(ad);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView parent, View view, final int position, long id) {
                drawer.setDrawerListener( new DrawerLayout.SimpleDrawerListener(){

                    @Override
                    public void onDrawerClosed(View drawerView){
                        super.onDrawerClosed(drawerView);
                        FragmentTransaction transition = getSupportFragmentManager().beginTransaction();
                        transition.replace(R.id.mains, Fragment.instantiate(MainActivity.this, fragments[position]));
                        transition.commit();
                    }
                });
                drawer.closeDrawer(list);
            }
        });
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);

        actionBarDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        actionBarDrawerToggle.onConfigurationChanged(newConfig);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (actionBarDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        switch (item.getItemId())
        {
            case R.id.mainMenuAbout:
                Toast.makeText(this, "F1 Holo", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.mainMenuQuitter:
                finish();
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {    
        getMenuInflater().inflate(R.menu.main_menu, menu);
        getMenuInflater().inflate(R.menu.main_about, menu);
        return true;    
    }
}

这是我的FirstFragment

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FirstFragment extends Fragment {

    public static Fragment newInstance(Context context) {
        FirstFragment frag = new FirstFragment();
        return frag;
    }

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

【问题讨论】:

  • 我不明白你的问题,请尝试更清楚。还请告诉我们您迄今为止为解决问题所做的尝试,并准确说明您遇到的问题。
  • 当我打开应用程序时,一旦图标抽屉导航完美运行。但是当我点击抽屉的一部分时,这个部分正常关闭,但图标仍处于打开位置。对不起我的英语
  • 您确定您的代码复制正确吗?因为你的Activity有错误。
  • 请在以后尝试正确格式化您的代码......这次我已经处理好了。
  • MainActivity 中的错误:在您的 onCreate() 方法中,这里有问题:ActionBarDrawerToggle(this, drawer, R.drawable.navdrawer, R.string.open, R.string.close 正如您所看到的,没有右括号,没有分号,而且开头的 ActionBarDrawerToggle似乎也错了。请检查您在将代码复制到 Stack Overflow 时可能出错的代码。在您的Activity 中的onOptionsItemSelected() 中,在最后一个case 语句中的finish(); 之后缺少break;。虽然技术上不需要它,但它应该仍然存在。

标签: android fragment


【解决方案1】:

我已经找到了解决方案,而且很明显,我可能会因为之前没有注意到而自责...

问题出在这里:

list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView parent, View view, final int position, long id) {
        drawer.setDrawerListener( new DrawerLayout.SimpleDrawerListener() {

            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
                FragmentTransaction transition = getSupportFragmentManager().beginTransaction();
                transition.replace(R.id.mains, Fragment.instantiate(MainActivity.this, fragments[position]));
                transition.commit();
            }
        });
        drawer.closeDrawer(list);
    }
});

在此 OnClickListener 中,您正在设置一个新的 SimpleDrawerListener 并因此覆盖此行:

drawer.setDrawerListener(actionBarDrawerToggle);

这会将ActionBarDrawerToogleDrawerLayout 断开连接,从而停止播放动画...这就是您所需要的:

list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView parent, View view, final int position, long id) {
        FragmentTransaction transition = getSupportFragmentManager().beginTransaction();
        transition.replace(R.id.mains, Fragment.instantiate(MainActivity.this, fragments[position]));
        transition.commit();

        drawer.closeDrawer(list);
    }
});

你为什么要这样做呢?它只会在用户选择项目和实际更改的内容之间造成延迟。如果是因为性能问题 - 可能是 NavigationDrawer 的关闭动画播放不正确 - 那么做这样的事情可能是合适的,但无论如何如果你决定实现这个,请这样做:

首先创建名为drawerItemSelection的全局变量:

private String drawerItemSelection = null;

然后像这样实现你的ItemClickListener

list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView parent, View view, final int position, long id) {
        drawerItemSelection = fragments[position];

        drawer.closeDrawer(list);
    }
});

最后在您的onCreate() 方法中实现ActionBarDrawerToogle,如下所示:

actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawer, R.drawable.navdrawer, R.string.open, R.string.close) {

    @Override
    public void onDrawerClosed(View drawerView) {
        super.onDrawerClosed(drawerView);

        if(drawerItemSelection != null) {
            FragmentTransaction transition = getSupportFragmentManager().beginTransaction();
            transition.replace(R.id.mains, Fragment.instantiate(MainActivity.this, drawerItemSelection));
            transition.commit();

            drawerItemSelection = null;
        }
    }
};

如果您还有其他问题,请随时提问!

【讨论】:

  • 对不起,检查后代码完全一样。我不明白为什么单击抽屉导航位置的片段后图标仍然打开。
  • 现在,当我点击导航元素的抽屉时,图标将保持关闭状态。
  • 好吧,然后也覆盖onDrawerOpened(),并在那里调用syncState(),看看它是否有效。这两件事都不是必需的,但如果能解决问题,应该没问题。
  • 是添加 onDrawerOpened() 没问题,但是图标的位置只是打开或关闭,没有动画
  • 我会尝试重现问题,给我几个小时,我可能会有解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多