Java setListNavigationCallbacks在切换到横向后使应用程序崩溃
我正在创建一个简单的应用程序管理器来训练自己开发android应用程序。 我希望我的操作栏(actionbarcompat)具有下拉导航+标题+副标题,我通过创建自定义适配器实现了这一点,但我不知道如何使我的操作栏使用该微调器适配器。所以我做了一个简单的研究,最终通过“setListNavigationCallbacks”实现了我的目标,第一个参数是传递适配器,第二个参数是“OnNavigationListener”。 但我有两个问题:Java setListNavigationCallbacks在切换到横向后使应用程序崩溃,java,android,android-listfragment,Java,Android,Android Listfragment,我正在创建一个简单的应用程序管理器来训练自己开发android应用程序。 我希望我的操作栏(actionbarcompat)具有下拉导航+标题+副标题,我通过创建自定义适配器实现了这一点,但我不知道如何使我的操作栏使用该微调器适配器。所以我做了一个简单的研究,最终通过“setListNavigationCallbacks”实现了我的目标,第一个参数是传递适配器,第二个参数是“OnNavigationListener”。 但我有两个问题: 我不熟悉侦听器及其工作方式,我想知道是否可以将适配器设置为
public class MainActivity extends ActionBarActivity {
private FragmentTransaction fragmentTransaction = getSupportFragmentManager ( ).beginTransaction ( );
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super.onCreate ( savedInstanceState );
setContentView ( R.layout.activity_main );
getSupportActionBar ( ).setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
getSupportActionBar ( ).setTitle("");
if ( findViewById ( R.id.activity_application_manager_framelayout ) != null && savedInstanceState == null ) {
ApplicationsListFragment applicationsListFragment = new ApplicationsListFragment ( );
applicationsListFragment.setArguments ( getIntent ( ).getExtras ( ) );
fragmentTransaction.add ( R.id.activity_application_manager_framelayout , applicationsListFragment ).commit ( );
}
}
@Override
public boolean onCreateOptionsMenu ( Menu menu ) {
getMenuInflater ( ).inflate ( R.menu.main , menu );
return true;
}
}
ApplicationListFragment.java
public class ApplicationsListFragment extends ListFragment {
private ListView listView;
private ApplicationManager applicationManager;
private ActionBar actionBar;
private CustomAdapter customAdapter;
private CustomAdapter.ActionBarDropDownCustomAdapter actionBarDropDownCustomAdapter;
private CustomAdapter.ApplicationsListCustomAdapter applicationsListCustomAdapter;
private List < ApplicationInfo > applications = new ArrayList < ApplicationInfo > ( );
private List < String > actionBarDropDownItems = new ArrayList < String > ( );
@Override
public View onCreateView ( LayoutInflater inflater , ViewGroup container , Bundle savedInstanceState ) {
View view = inflater.inflate ( R.layout.fragment_applications_list , container , false );
this.listView = ( ListView ) view.findViewById ( android.R.id.list );
this.actionBarDropDownItems.add ( "All Apps" );
this.actionBarDropDownItems.add ( "User Apps" );
this.actionBarDropDownItems.add ( "System Apps" );
customAdapter = new CustomAdapter ( );
actionBarDropDownCustomAdapter = customAdapter.new ActionBarDropDownCustomAdapter ( getActivity ( ) , R.layout.spinner_activity_main_actionbar , R.layout.list_item_activity_main_actionbar , this.actionBarDropDownItems );
actionBar.setListNavigationCallbacks ( actionBarDropDownCustomAdapter , new OnNavigationListener( ) {
@Override
public boolean onNavigationItemSelected ( int arg0 , long arg1 ) {
if ( actionBarDropDownItems.get ( arg0 ).equals ( actionBarDropDownItems.get ( 0 ) ) ) {
refreshDisplay ( 0 );
} else if ( actionBarDropDownItems.get ( arg0 ).equals ( actionBarDropDownItems.get ( 1 ) ) ) {
refreshDisplay ( 1 );
} else if ( actionBarDropDownItems.get ( arg0 ).equals ( actionBarDropDownItems.get ( 2 ) ) ) {
refreshDisplay ( 2 );
}
return false;
}
} );
return view;
}
@Override
public void onActivityCreated ( Bundle savedInstanceState ) {
super.onActivityCreated ( savedInstanceState );
this.applicationManager = new ApplicationManager ( getActivity() );
refreshDisplay ( 0 );
}
@Override
public void onAttach ( Activity activity ) {
super.onAttach ( activity );
actionBar = ( ( ActionBarActivity ) activity ).getSupportActionBar ( );
}
public boolean refreshDisplay ( int flag ) {
if ( flag == 0 ) {
this.applications = this.applicationManager.getAllAppInfos ( );
this.applicationsListCustomAdapter = customAdapter.new ApplicationsListCustomAdapter ( getActivity() , R.layout.list_item_fragment_applications_list , this.applications );
this.listView.setAdapter ( applicationsListCustomAdapter );
return true;
} else if ( flag == 1 ) {
this.applications = this.applicationManager.getAllUserAppInfos ( );
this.applicationsListCustomAdapter = customAdapter.new ApplicationsListCustomAdapter ( getActivity() , R.layout.list_item_fragment_applications_list , this.applications );
this.listView.setAdapter ( applicationsListCustomAdapter );
return true;
} else if ( flag == 2 ) {
this.applications = this.applicationManager.getAllSystemAppInfos ( );
this.applicationsListCustomAdapter = customAdapter.new ApplicationsListCustomAdapter ( getActivity() , R.layout.list_item_fragment_applications_list , this.applications );
this.listView.setAdapter ( applicationsListCustomAdapter );
return true;
} else {
return false;
}
}
公共类应用程序ListFragment扩展ListFragment{
私有列表视图列表视图;
私有应用程序管理器应用程序管理器;
私人ActionBar ActionBar;
专用自定义适配器;
私有CustomAdapter.ActionBarDropDownCustomAdapter ActionBarDropDownCustomAdapter;
私有CustomAdapter.ApplicationListCustomAdapter应用程序ListCustomAdapter;
私有列表applications=newarraylist();
私有列表actionBarDropDownItems=newArrayList();
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图=充气机。充气(R.layout.fragment\u应用程序列表,容器,false);
this.listView=(listView)view.findViewById(android.R.id.list);
this.actionBarDropDownItems.add(“所有应用程序”);
this.actionBarDropDownItems.add(“用户应用”);
this.actionBarDropDownItems.add(“系统应用”);
customAdapter=新的customAdapter();
actionBarDropDownCustomAdapter=customAdapter.new actionBarDropDownCustomAdapter(getActivity(),R.layout.spinner\u activity\u main\u actionbar,R.layout.list\u item\u activity\u main\u actionbar,this.actionBarDropDownItems);
actionBar.setListNavigationCallbacks(actionBarDropDownCustomAdapter,新的OnNavigationListener(){
@凌驾
公共布尔值onNavigationItemSelected(int arg0,long arg1){
if(actionBarDropDownItems.get(arg0).equals(actionBarDropDownItems.get(0))){
刷新显示(0);
}else if(actionBarDropDownItems.get(arg0).equals(actionBarDropDownItems.get(1))){
刷新显示(1);
}else if(actionBarDropDownItems.get(arg0).equals(actionBarDropDownItems.get(2))){
刷新显示(2);
}
返回false;
}
} );
返回视图;
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
this.applicationManager=新的applicationManager(getActivity());
刷新显示(0);
}
@凌驾
公共事务主任(活动){
超级转速计(活动);
actionBar=((ActionBarActivity)活动);
}
公共布尔刷新显示(int标志){
如果(标志==0){
this.applications=this.applicationManager.getallappingfos();
this.applicationsListCustomAdapter=customAdapter.new applicationsListCustomAdapter(getActivity(),R.layout.list\u item\u fragment\u applications\u list,this.applications);
this.listView.setAdapter(ApplicationListCustomAdapter);
返回true;
}else if(标志==1){
this.applications=this.applicationManager.getalluserappingfos();
this.applicationsListCustomAdapter=customAdapter.new applicationsListCustomAdapter(getActivity(),R.layout.list\u item\u fragment\u applications\u list,this.applications);
this.listView.setAdapter(ApplicationListCustomAdapter);
返回true;
}else if(标志==2){
this.applications=this.applicationManager.getAllSystemAppInfos();
this.applicationsListCustomAdapter=customAdapter.new applicationsListCustomAdapter(getActivity(),R.layout.list\u item\u fragment\u applications\u list,this.applications);
this.listView.setAdapter(ApplicationListCustomAdapter);
返回true;
}否则{
返回false;
}
}
}我找到了两个问题的解决方案,所以我想和大家分享一下: 1-在类中实现“ActionBar.OnNavigationListener”,然后重写类中的“onNavigationItemSelected”方法,最后将类作为“setListNavigationCallbacks”的第二个参数传入(当然带有“this”关键字)
2-您必须重写活动的“onSaveInstanceState”方法(而不是片段),并在“savedInstanceState”中放入一个整数(getSupportActionBar().getSelectedNavigationIndex()),然后重写活动的“onRestoreInstanceState”方法并设置“getSupportActionBar().setSelectedNavigationItem()”您保存在“onSaveInstanceState”中的值。是否有人知道此问题的答案?是否希望我也发布适配器?16个视图,没有答案?我死在水里了。你需要发布你的堆栈跟踪和崩溃异常,这样我们就可以看到发生了什么。如果我能得到我的堆栈跟踪,我现在就已经修复了。问题是我的AVM不工作。Eclipse说它无法连接到我的AVM,我甚至试着启动一个