简体   繁体   English

带选项卡和片段的ActionBar

[英]ActionBar with Tabs and Fragments

Okay, so i'm extremely frustrated by logcat. 好的,所以我对logcat感到非常沮丧。 I created an Application that uses a main activity to host two tabs with fragments. 我创建了一个应用程序,该应用程序使用主要活动来托管两个带有片段的选项卡。

I can't seem to figure out what my problem is. 我似乎无法弄清楚我的问题是什么。 I am following a tutorial and it doesn't work. 我正在学习一个教程,但它不起作用。

UPDATE- Solution posted below. 更新-解决方案在下面发布。 I had the wrong code in the Tab Interface methods. 我在Tab接口方法中输入了错误的代码。 I was calling detach in onTabSelected() therefore the Fragment Manager Back Stack was always null on initialization, and in my onTabReselected method I was attempting to add the intial fragments. 我在onTabSelected()中调用detach,因此,片段管理器后向堆栈在初始化时始终为空,并且在我的onTabReselected方法中,我尝试添加初始片段。 Very dumb mistake. 非常愚蠢的错误。 -- Thanks for the help in pushing me to find this simple mistake. -感谢您协助我找出这个简单的错误。

Here is my MainActivity: 这是我的MainActivity:

package com.example.tabs;

import android.app.ActionBar;
import android.app.ActionBar.TabListener;
import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity{

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

    ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    // Create the Tabs and Add them to the ActionBar
    ActionBar.Tab tab1 = actionBar.newTab();
    TabListener tab1Listener = new SimpleTabListener(this, Fragment1.class.getName());
    tab1.setText("Fragment 1");
    tab1.setTabListener(tab1Listener);
    actionBar.addTab(tab1);

    ActionBar.Tab tab2 = actionBar.newTab();
    TabListener tab2Listener = new SimpleTabListener(this, Fragment2.class.getName());
    tab2.setText("Fragment 2");
    tab2.setTabListener(tab2Listener);
    actionBar.addTab(tab2);

}

} }

Here are my Fragments: package com.example.tabs; 这是我的片段:package com.example.tabs;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment1 extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    return inflater.inflate(R.layout.fragment_1, container, false);
}

} package com.example.tabs; }包com.example.tabs;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


public class Fragment2 extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    return inflater.inflate(R.layout.fragment2, container, false);

}

} }

And here is my SimpleTabListener: 这是我的SimpleTabListener:

package com.example.tabs;

import android.app.ActionBar;
import android.app.ActionBar.TabListener;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.Context;

  public class SimpleTabListener implements ActionBar.TabListener {


Context m_context;
String m_fragmentClassName ;
Fragment m_fragment = null;


public  SimpleTabListener(Context context, String tabFragmentClassName)
{
    m_context = context;
    m_fragmentClassName = tabFragmentClassName;
}

@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) 
{
    // TODO Auto-generated method stub

    if(m_fragment == null)
    {
        m_fragment = Fragment.instantiate(m_context, m_fragmentClassName);
        ft.add(R.id.contentContainer, m_fragment);
    }else
    {
        ft.attach(m_fragment);
    }

}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft)
{
    // TODO Auto-generated method stub
    ft.detach(m_fragment);

}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) 
{
    // TODO Auto-generated method stub

}

} }

Can someone please help me figure out Why the Fragment.instantiate Method will not build my fragments? 有人可以帮我弄清楚为什么Fragment.instantiate方法不能建立我的片段吗?

This is so frustrating. 这真令人沮丧。 . .

Here is my Logcat 这是我的Logcat

01-17 15:16:57.719: W/dalvikvm(6227): threadid=1: thread exiting with uncaught exception (group=0x40fc8930)
01-17 15:16:57.719: E/AndroidRuntime(6227): FATAL EXCEPTION: main
01-17 15:16:57.719: E/AndroidRuntime(6227): java.lang.RuntimeException: Unable to start     activity ComponentInfo{com.example/com.example.MainActivity}: java.lang.NullPointerException
01-17 15:16:57.719: E/AndroidRuntime(6227):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2245)
01-17 15:16:57.719: E/AndroidRuntime(6227):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2295)
01-17 15:16:57.719: E/AndroidRuntime(6227):     at android.app.ActivityThread.access$700(ActivityThread.java:150)
01-17 15:16:57.719: E/AndroidRuntime(6227):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1280)
01-17 15:16:57.719: E/AndroidRuntime(6227):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-17 15:16:57.719: E/AndroidRuntime(6227):     at android.os.Looper.loop(Looper.java:175)
01-17 15:16:57.719: E/AndroidRuntime(6227):     at android.app.ActivityThread.main(ActivityThread.java:5279)
01-17 15:16:57.719: E/AndroidRuntime(6227):     at java.lang.reflect.Method.invokeNative(Native Method)
01-17 15:16:57.719: E/AndroidRuntime(6227):     at java.lang.reflect.Method.invoke(Method.java:511)
01-17 15:16:57.719: E/AndroidRuntime(6227):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
01-17 15:16:57.719: E/AndroidRuntime(6227):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
01-17 15:16:57.719: E/AndroidRuntime(6227):     at dalvik.system.NativeStart.main(Native Method)
01-17 15:16:57.719: E/AndroidRuntime(6227): Caused by: java.lang.NullPointerException
01-17 15:16:57.719: E/AndroidRuntime(6227):     at android.app.BackStackRecord.run(BackStackRecord.java:666)
01-17 15:16:57.719: E/AndroidRuntime(6227):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1455)
01-17 15:16:57.719: E/AndroidRuntime(6227):     at android.app.Activity.performStart(Activity.java:5292)
01-17 15:16:57.719: E/AndroidRuntime(6227):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2218)
01-17 15:16:57.719: E/AndroidRuntime(6227):     ... 11 more
01-17 15:16:57.766: E/dalvikvm(6227): adjustAdaptiveCoef max=8388608, min=2097152, ut=368

Wow i feel dumb for this one. 哇,我为此感到愚蠢。 so the solution was that I had the Wrong Tab Selection Code. 因此解决方案是我使用了错误的选项卡选择代码。 I was implementing my tab code in the onTabReselected Method instead of onTabSelected 我在onTabReselected方法而不是onTabSelected中实现了我的标签代码

@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) 
{
    // TODO Auto-generated method stub


}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft)
{
    if(m_fragment == null)
    {
        m_fragment = Fragment.instantiate(m_context, m_fragmentClassName);
        ft.add(android.R.id.content, m_fragment);
    }else
    {
        ft.attach(m_fragment);
    }

}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) 
{
    // TODO Auto-generated method stub
    if(m_fragment != null){
        // TODO Auto-generated method stub
        ft.detach(m_fragment);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM