2016-09-06 3 views
0

В моем приложении у меня есть SearchView, который при нажатии открывается ExpandableListView внутри Fragment, в котором отображаются некоторые результаты поиска. Теперь у меня есть проблема, что каждый раз я нажимаю на searchIcon, когда приложение выходит из строя.Системные службы недоступны для деятельности до onCreate() в расширяемом ListView

MainActivity.Java:

public class MainActivity extends AppCompatActivity implements SearchView.OnQueryTextListener 
{ 

    private ExpListAdapter listAdapter; 
    private ExpandableListView expList; 
    private ArrayList<parentClass> parentList = new ArrayList<>(); 

    private boolean b = true; 
    sql sqlo = new sql(); 



    @Override 
    protected void onCreate (Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     Intent sIntent = getIntent(); 
     if (Intent.ACTION_SEARCH.equals(sIntent.getAction())) { 
      String query = sIntent.getStringExtra(SearchManager.QUERY); 


     }} 


    public void searchClick(MenuItem item){ 
     Fragment frag = new Results(); 

     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 

     ft.replace(R.id.FragFaecher,frag).commit(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.menu_main, menu); 


     SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); 

     searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
     searchView.setIconifiedByDefault(false); 
     searchView.setOnQueryTextListener(this); 

     searchView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { 
      @Override 
      public void onViewAttachedToWindow(View v) { 

      } 

      @Override 
      public void onViewDetachedFromWindow(View v) { 
      Fragment frag = new FaecherFrag(); 
       FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
       ft.replace(R.id.FragFaecher,frag).commit(); 
      } 
     }); 



     return true; 
    } 


     public void displayList(ExpandableListView expList){ 
     if(b){populateList();} 

     listAdapter = new ExpListAdapter(MainActivity.this,parentList); 
     expList.setAdapter(listAdapter); 
     b = false; 
    } 

    private void populateList(){ 
     String[] cThema = sqlo.getAlleThemen(this); 
     String[] cFormel = sqlo.getAlleFormeln(this); 
     int cThemaLength = cThema.length; 
     int cFormelLength = cFormel.length; 
     childClass Child; 

     ArrayList<childClass> childList = new ArrayList<>(); 

     for (int i=0; i<cThemaLength;i++){Child = new childClass(cThema[i]);childList.add(Child);} 
     parentClass Parent = new parentClass("Themen",childList); 
     parentList.add(Parent); 

     childList = new ArrayList<>(); 

     for (int i=0;i<cFormelLength;i++){Child = new childClass(cFormel[i]);childList.add(Child);} 
     Parent = new parentClass("Formeln",childList); 

     parentList.add(Parent); 

    } 

    @Override 
    public boolean onQueryTextSubmit(String query) { 

     return false; 
    } 

    @Override 
    public boolean onQueryTextChange(String query) { 

     return false; 
    } 
} 

ExpListAdapter.Java:

public class ExpListAdapter extends BaseExpandableListAdapter { 

    private Context context; 
    private ArrayList<parentClass> parentList; 
    private ArrayList<parentClass> originalList; 

    public ExpListAdapter(Context context, ArrayList<parentClass> parentList){ 
     this.context = context; 
     this.parentList = new ArrayList<>(); 
     this.parentList.addAll(parentList); 
     this.originalList = new ArrayList<>(); 
     this.originalList.addAll(parentList); 
    } 

    @Override 
    public int getGroupCount() { 
     return parentList.size(); 
    } 

    @Override 
    public int getChildrenCount(int groupPosition) { 
     ArrayList<childClass> childList = parentList.get(groupPosition).getChildList(); 
     return childList.size(); 
    } 

    @Override 
    public Object getGroup(int groupPosition) { 
     return parentList.get(groupPosition); 
    } 

    @Override 
    public Object getChild(int groupPosition, int childPosition) { 
     ArrayList<childClass> childList = parentList.get(groupPosition).getChildList(); 
     return childList.get(childPosition); 
    } 

    @Override 
    public long getGroupId(int groupPosition) { 
     return groupPosition; 
    } 

    @Override 
    public long getChildId(int groupPosition, int childPosition) { 

     return childPosition; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return true; 
    } 



    @Override 
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
     childClass child = (childClass) getChild(groupPosition,childPosition); 
     if (convertView == null){ 
      LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = layoutInflater.inflate(R.layout.child_row,null); 
     } 
     TextView name = (TextView) convertView.findViewById(R.id.name); 
     name.setText(child.getName().trim()); 

     return convertView; 
    } 

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup Parent) { 
     parentClass parent = (parentClass) getGroup(groupPosition); 
     if(convertView == null){ 
      LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = layoutInflater.inflate(R.layout.parent_row,null); 

     } 
     TextView heading = (TextView) convertView.findViewById(R.id.heading); 
     heading.setText(parent.getName().trim()); 
     return convertView; 
    } 

    @Override 
    public boolean isChildSelectable(int groupPosition, int childPosition) { 
     return true; 
    } 

    public void filterData(String query){ 

    } 
} 

Фрагмент:

public class Results extends Fragment { 

    ExpandableListView expList; 

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

     View rootView = inflater.inflate(R.layout.fragment_results, container, false); 

     return rootView; 

    } 

    public void onStart(){ 
     super.onStart(); 
     expList = (ExpandableListView) getView().findViewById(R.id.expList); 
     MainActivity ma = new MainActivity(); 
     ma.displayList(expList); 
    } 
} 

я го e Error "java.lang.IllegalStateException: системные службы, недоступные для операций до onCreate()" в методе getGroupView(). Но если я не ошибаюсь, я уже назвал onCreate моей MainActivity. Итак, почему возникает эта ошибка?

FATAL ИСКЛЮЧЕНИЕ: главный процесса: formelhelfer5_10.formelhelfer5_10, PID: 2301 java.lang.IllegalStateException: Системные сервисы не доступны для деятельности до OnCreate() в android.app.Activity.getSystemService (Activity.java : 5581) на formelhelfer5_10.formelhelfer5_10.ExpListAdapter.getGroupView (ExpListAdapter.java:86) на android.widget.ExpandableListConnector.getView (ExpandableListConnector.java:446) на android.widget.AbsListView.obtainView (AbsListView.java:2360) на android.widget.ListView.measureHeightOfChildren (ListView.java:1326) на android.widget.ListView.onMeasure (ListView.java:1233) на android.view.View.measure (View.java:19731) на android .view.ViewGroup.measureChildWithMargins (ViewGroup.java:6120) на android.widget.LinearLayout.measureChildBeforeLayout (LinearLayout.java:1464) на android.widget.LinearLayout.measureVertical (LinearLayout.java:758) в android.widget .LinearLayout.onMeasure (LinearLayout.java:640) на android.view.View.measure (View.java:19731) на android.view.ViewGroup.measureChildWithMargins (Просмотреть Group.java:6120) на android.widget.FrameLayout.onMeasure (FrameLayout.java:185) на android.view.View.measure (View.java:19731) на android.widget.RelativeLayout.measureChildHorizontal (RelativeLayout. java: 715) на android.widget.RelativeLayout.onMeasure (RelativeLayout.java:461) на android.view.View.measure (View.java:19731) на android.view.ViewGroup.measureChildWithMargins (ViewGroup.java: 6120) на android.support.design.widget.CoordinatorLayout.onMeasureChild (CoordinatorLayout.java:668) на android.support.design.widget.HeaderScrollingViewBehavior.onMeasureChild (HeaderScrolling ViewBehavior.java:90) at android.support.design.widget.AppBarLayout $ ScrollingViewBehavior.onMeasureChild (AppBarLayout.java:1192) at android.support.design.widget.CoordinatorLayout.onMeasure (CoordinatorLayout.java: 733) на android.view.View.measure (View.java:19731) на android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:6120) на android.widget.FrameLayout.onMeasure (FrameLayout.java: 185) на android.support.v7.widget.ContentFrameLayout.onMeasure (ContentFrameLayout.java:135) на android.view.View.measure (View.java:19731) на android.view.ViewGroup.measureChildWithMargins (ViewGroup. java: 6120) на android.widget.LinearLayout.measureChildBeforeLayout (LinearLayout.java:1464) на android.widget.LinearLayout.measureVertical (LinearLayout.java:758) на android.widget.LinearLayout.onMeasure (LinearLayout.java:640) на android.view.View.measure (View.java:19731) на android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:6120) на android .widget.FrameLayout.onMeasure (FrameLayout.java:185) на android.view.View.measure (View.java:19731) на android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:6120) на android.widget .LinearLayout.measureChildBeforeLayout (LinearLayout.java:1464) на android.widget.LinearLayout.measureVertical (LinearLayout.java:758) на android.widget.LinearLayout.onMeasure (Linea rLayout.java:640) на android.view.View.measure (View.java:19731) на android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:6120) на android.widget.FrameLayout.onMeasure (FrameLayout. java: 185) at com.android.internal.policy.DecorView.onMeasure (DecorView.java:687) на android.view.View.measure (View.java:19731) на android.view.ViewRootImpl.performMeasure (ViewRootImpl.java:2271) в android.view.ViewRootImpl.measureHierarchy (ViewRootImpl.java:1358) на android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:1607) на android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1246) на android.view.ViewRootImpl $ TraversalRunnable.run (ViewRootImpl.java:6301) на android.view.Choreographer $ CallbackRecord.run (Choreographer.java:871) на android.view.Choreographer.doCallbacks (Хореограф.java:683) на android.view.Choreographer.doFrame (Хореограф.java:619) на android.view.Choreographer $ FrameDisplayEventReceiver.run (Хореограф.java:857) на android.os.Handler.handleCallback (Handler.java:751) 09-06 13: 13: 20.688 2301-2301/formelhelfer5_10.formelhelfer5_10 E/AndroidRuntime: at android.os.Handler.dispatchMessage (Handler.java: 95) на android.os.Looper.loop (Looper.java:154) на android.app.ActivityThread.main (ActivityThread.java:6077) на java.lang.reflect.Method.invoke (родной метод) at com. android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main (ZygoteInit.Java: 755)

+0

Пожалуйста редактировать свой вопрос и отправить весь стек Java след. – CommonsWare

+0

напишите полный столик здесь – Vyacheslav

ответ

0

Используйте это:

View.inflate(ctx, R.layout.parent_row, null);

внутри этого:

@Override 
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup Parent) { 
     parentClass parent = (parentClass) getGroup(groupPosition); 
     if(convertView == null){ 
      convertView = View.inflate(ctx, R.layout.parent_row, null); 

     } 
     TextView heading = (TextView) convertView.findViewById(R.id.heading); 
     heading.setText(parent.getName().trim()); 
     return convertView; 
    } 
+0

он работал. Большое спасибо – adriankroeger

1
MainActivity ma = new MainActivity(); 
ma.displayList(expList); 

Никогда инстанцирует деятельность с new. Такие экземпляры не инициализируются для всего, что вы использовали бы для Activity, например, для использования в качестве Context с доступом к системным службам.

В фрагменте вы можете получить доступ к подключенной хостинговой деятельности с помощью getActivity(). Используйте это вместо создания нового действия.

+0

благодарю вас за объяснение этого – adriankroeger

0

1) Как фигура laalto - никогда не создавайте действия с помощью new.

изменение

public void onStart(){ 
    super.onStart(); 
    expList = (ExpandableListView) getView().findViewById(R.id.expList); 
    MainActivity ma = new MainActivity(); 
    ma.displayList(expList); 
} 

с

public void onStart(){ 
    super.onStart(); 
    expList = (ExpandableListView) getView().findViewById(R.id.expList); 
    MainActivity ma = (MainActivity) getActivity(); 
    ma.displayList(expList); 
} 

2) Это не хорошая идея, чтобы создать так глубоко DEPENDENCY

+0

спасибо, изменил мой код на это – adriankroeger

Смежные вопросы