2017-03-16 78 views
-3

所以我试图通过点击默认模板导航栏上的按钮来启动一个片段,我使用片段事务和提交,但应用程序崩溃,无法找到隐藏在android监视器错误部分中的活动下降。我得到这个崩溃使用替换和添加。片段:无法找到活动?

这里是片段我想补充:

public class FoodScroll extends ListFragment implements AdapterView.OnItemClickListener{ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     return inflater.inflate(R.layout.fragment_foodscroll, container, false); 
    } 
    @Override 
    public void onActivityCreated(Bundle savedInstanceState){ 
     super.onActivityCreated(savedInstanceState); 
     ArrayAdapter adapter = ArrayAdapter.createFromResource(getActivity(), R.array.foods, android.R.layout.simple_list_item_1); 
     setListAdapter(adapter); 
     getListView().setOnItemClickListener(this); 
    } 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id){ 
     Toast.makeText(getActivity(), "Item" + position, Toast.LENGTH_SHORT).show(); 
    } 
} 

这里是我想将它放在活动:

public class MainActivity extends AppCompatActivity{ 

    private FragmentManager manager = getFragmentManager(); 
    private FragmentTransaction transaction = manager.beginTransaction(); 
    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener 
      = new BottomNavigationView.OnNavigationItemSelectedListener() { 

     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 

      switch (item.getItemId()) { 
       case R.id.navigation_home: 
        FoodScroll foods = new FoodScroll(); 
        transaction.replace(R.id.container, foods); 
        transaction.commit(); 
        return true; 
       case R.id.navigation_dashboard: 

        return true; 
       case R.id.navigation_notifications: 

        return true; 
      } 
      return false; 
     } 

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

     BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); 
     navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); 

    } 
} 

package语句是不缺的,我把它在片段之外。 道歉,如果我不正确地放置代码或东西。

该logcat工作不正常,我不得不重新启动android工作室,让它再次工作。这是显示的内容

03-15 22:57:17.090 3238-3238/? I/art: Not late-enabling -Xcheck:jni (already on) 
 
03-15 22:57:17.090 3238-3238/? W/art: Unexpected CPU variant for X86 using defaults: x86 
 
03-15 22:57:17.110 3238-3245/? E/art: Failed sending reply to debugger: Broken pipe 
 
03-15 22:57:17.110 3238-3245/? I/art: Debugger is no longer active 
 
03-15 22:57:17.110 3238-3245/? I/art: Starting a blocking GC Instrumentation 
 
03-15 22:57:17.199 3238-3238/? W/System: ClassLoader referenced unknown path: /data/app/com.namename.www.name-2/lib/x86 
 
03-15 22:57:17.253 3238-3238/? W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable 
 
03-15 22:57:17.393 3238-3238/? I/InstantRun: Starting Instant Run Server for com.namename.www.name 
 
03-15 22:57:17.454 3238-3262/? I/OpenGLRenderer: Initialized EGL, version 1.4 
 
03-15 22:57:17.454 3238-3262/? D/OpenGLRenderer: Swap behavior 1 
 
03-15 22:57:17.454 3238-3262/? W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without... 
 
03-15 22:57:17.454 3238-3262/? D/OpenGLRenderer: Swap behavior 0 
 
03-15 22:57:17.488 3238-3238/? W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView 
 
03-15 22:57:25.564 3238-3238/com.chilosomexicanbistro.www.chiloso D/AndroidRuntime: Shutting down VM 
 
03-15 22:57:25.564 3238-3238/com.chilosomexicanbistro.www.chiloso E/AndroidRuntime: FATAL EXCEPTION: main 
 
                        Process: com.namename.www.name, PID: 3238 
 
                        java.lang.RuntimeException: Content has view with id attribute 'android.R.id.list' that is not a ListView class 
 
                         at android.app.ListFragment.ensureList(ListFragment.java:402) 
 
                         at android.app.ListFragment.onViewCreated(ListFragment.java:203) 
 
                         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1010) 
 
                         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1171) 
 
                         at android.app.BackStackRecord.run(BackStackRecord.java:816) 
 
                         at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1578) 
 
                         at android.app.FragmentManagerImpl$1.run(FragmentManager.java:483) 
 
                         at android.os.Handler.handleCallback(Handler.java:751) 
 
                         at android.os.Handler.dispatchMessage(Handler.java:95) 
 
                         at android.os.Looper.loop(Looper.java:154) 
 
                         at android.app.ActivityThread.main(ActivityThread.java:6119) 
 
                         at java.lang.reflect.Method.invoke(Native Method) 
 
                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
 
                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

+1

请发布堆栈跟踪。 http://stackoverflow.com/questions/23353173/uncomfort-myapp-has-stopped-how-can-i-solve-this –

+1

堆栈跟踪与您提供的代码不匹配。该代码不会在'onNavigationItemSelected()'中调用'startActivity()'。如果您的应用程序与您显示的代码崩溃,则需要提供该堆栈跟踪。如果它没有从代码中崩溃,你需要更好地解释问题是什么。 –

+0

我不知道,那是什么在错误的Android监视器选项卡。当我点击应该添加或替换片段的按钮时,该应用崩溃,说它已停止。 –

回答

1

有几个问题在这里:

问题1 - 使用静态初始化错误

private FragmentManager manager = getFragmentManager(); //no! don't do this 
private FragmentTransaction transaction = manager.beginTransaction(); //no! 

使用静态初始化呢与Android Activity lifecycles不一致。请仔细研究这些内容并密切关注Android文档中的示例 - 您几乎不会在示例Activity和Fragments中找到任何静态初始化。

问题2 - 不检查FragmentManager,看它是否已经包含了片段

 switch (item.getItemId()) { 
      case R.id.navigation_home: 
       FoodScroll foods = new FoodScroll(); //no! check first if the fragment is already in the FragmentManager 
       transaction.replace(R.id.container, foods); 
       transaction.commit(); 
       return true; 

这段代码是错的 - 同样,在示例中,你几乎总是看到惯用写为getFragmentManager().beginTransaction()...呼叫。请仔细阅读文档中的示例碎片和活动。相信我,这将节省您的时间:)

,而不是上面的代码,我想你想是这样的:

case R.id.navigation_home: 
    FoodScroll foods = getFragmentManager().findFragmentByTag("FOOD"); 
    if (foods == null) { 
     foods = new FoodScroll(); 
    } 
    getFragmentManager().beginTransaction().replace(R.id.container, foods, "FOOD").commit(); 
    return true; 

问题3 - 用正确的堆栈跟踪OP编辑之后更新:

根据Mike M的评论,在ListFragment中,如果使用自己的布局,ListView的ID必须是@android:id/list

+0

您发布的堆栈跟踪在我回答后深刻地改变了这个问题。麦克M的评论是正确的。 –

+0

我对此表示歉意 –

+0

@Fail Pail无需道歉,我认为答案仍然有用信息 –