Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android-如何从碎片活动中访问碎片_Java_Android_Android Fragments_Views_Android Fragmentactivity - Fatal编程技术网

Java Android-如何从碎片活动中访问碎片

Java Android-如何从碎片活动中访问碎片,java,android,android-fragments,views,android-fragmentactivity,Java,Android,Android Fragments,Views,Android Fragmentactivity,当我试图从我的主活动中访问片段时,我总是得到一个NullPointerException。不管我做什么 问题是我使用了TabsPagerAdapter和ViewPager,我不知道如何获取膨胀视图(片段的onCreate()方法已经返回膨胀视图) 目标是访问片段内部的元素,并通过一个后台线程动态隐藏或显示它,该线程也应该对更多片段执行此操作 MainActivity.java public class MainActivity extends FragmentActivity implement

当我试图从我的主活动中访问片段时,我总是得到一个
NullPointerException
。不管我做什么

问题是我使用了
TabsPagerAdapter
ViewPager
,我不知道如何获取膨胀视图(片段的
onCreate()
方法已经返回膨胀视图)

目标是访问片段内部的元素,并通过一个后台线程动态隐藏或显示它,该线程也应该对更多片段执行此操作

MainActivity.java

public class MainActivity extends FragmentActivity implements
        ActionBar.TabListener
{
/* swipe view */
private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private android.app.ActionBar actionBar;

// tab titles
private String[] tabs = { "Basic", "Advanced", "Settings"};


@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    /* init swipe views */
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
    viewPager = (ViewPager) findViewById(R.id.pager);
    viewPager.setAdapter(mAdapter);

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

    /* addTab returns void, how to geht my fragements and their views???*/
    for (String tabName : tabs)
        actionBar.addTab(actionBar.newTab().setText(tabName).setTabListener(this));

    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {}

        @Override
        public void onPageScrollStateChanged(int arg0) {}
    });
}

public void testFunction()
{
    FragmentPage1 fragmentPage1 = (FragmentPage1) getSupportFragmentManager().findFragmentById(R.layout.fragment_page1);
    GridLayout gridlayout = (GridLayout) fragmentPage1.getRootView().findViewById(R.id.adBannerBasicLayout);
    gridlayout.setVisibility(GridLayout.VISIBLE); /* THATS MY GOAL */
}
public class FragmentPage1 extends Fragment {

    private View rootView;

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

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


        /* HERE IT IS WORKING FINE, 
        but later I want to make it visible again 
        from code OUTSIDE FragmentPage1 ??? */

        GridLayout gridlayout = (GridLayout) rootView.findViewById(R.id.adBannerBasicLayout);
        gridlayout.setVisibility(GridLayout.GONE);

        return rootView;
    }    


    /* so I tried this, but also get always NullPointerException */
    public View getRootView()
    {
        return rootView;
    }
}
FragmentPage1.java

public class MainActivity extends FragmentActivity implements
        ActionBar.TabListener
{
/* swipe view */
private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private android.app.ActionBar actionBar;

// tab titles
private String[] tabs = { "Basic", "Advanced", "Settings"};


@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    /* init swipe views */
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
    viewPager = (ViewPager) findViewById(R.id.pager);
    viewPager.setAdapter(mAdapter);

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

    /* addTab returns void, how to geht my fragements and their views???*/
    for (String tabName : tabs)
        actionBar.addTab(actionBar.newTab().setText(tabName).setTabListener(this));

    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {}

        @Override
        public void onPageScrollStateChanged(int arg0) {}
    });
}

public void testFunction()
{
    FragmentPage1 fragmentPage1 = (FragmentPage1) getSupportFragmentManager().findFragmentById(R.layout.fragment_page1);
    GridLayout gridlayout = (GridLayout) fragmentPage1.getRootView().findViewById(R.id.adBannerBasicLayout);
    gridlayout.setVisibility(GridLayout.VISIBLE); /* THATS MY GOAL */
}
public class FragmentPage1 extends Fragment {

    private View rootView;

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

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


        /* HERE IT IS WORKING FINE, 
        but later I want to make it visible again 
        from code OUTSIDE FragmentPage1 ??? */

        GridLayout gridlayout = (GridLayout) rootView.findViewById(R.id.adBannerBasicLayout);
        gridlayout.setVisibility(GridLayout.GONE);

        return rootView;
    }    


    /* so I tried this, but also get always NullPointerException */
    public View getRootView()
    {
        return rootView;
    }
}
fragment_page1.xml

<?xml version="1.0" encoding="utf-8"?>

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    android:id="@+id/settings_scroll_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    >


    <GridLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:ads="http://schemas.android.com/apk/res-auto"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#000000"
        android:orientation="vertical"
        android:rowCount="12"
        android:columnCount="5"
        >

        <!-- Some Banner Ads I want to hide show -->           
        <!-- I want to access this from everywhere! --> 
        <GridLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:ads="http://schemas.android.com/apk/res-auto"
            android:id="@+id/adBannerBasicLayout"
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="fill"
            android:rowCount="3"
            android:columnCount="1"
            android:layout_row="0"
            android:layout_column="0"
            android:layout_columnSpan="5">

            <Space
                android:layout_width="0dp"
                android:layout_height="5dp"
                android:layout_row="0"
                android:layout_column="0"
                />

            <com.google.android.gms.ads.AdView
                android:id="@+id/adBannerBasic"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="fill"
                ads:adSize="BANNER"
                ads:adUnitId="xxxxxxxxxxxxxxxxxxxxxxxxxx"
                android:layout_row="1"
                android:layout_column="0"
                >
            </com.google.android.gms.ads.AdView>

            <Space
                android:layout_width="0dp"
                android:layout_height="5dp"
                android:layout_row="2"
                android:layout_column="0"
                />

        </GridLayout>

        <!-- more stuff... -->
  </GridLayout>
</ScrollView>
因为
getSupportFragmentManager()
总是返回空值:

FragmentPage1 fragmentPage1 = (FragmentPage1) getSupportFragmentManager().findFragmentById(R.layout.fragment_page1);
Logcat Outoput

java.lang.IllegalStateException: Could not execute method of the activity
            at android.view.View$1.onClick(View.java:3969)
            at android.view.View.performClick(View.java:4633)
            at android.view.View$PerformClick.run(View.java:19330)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at android.view.View$1.onClick(View.java:3964)
            at android.view.View.performClick(View.java:4633)
            at android.view.View$PerformClick.run(View.java:19330)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at org.tzapp.smote.MainActivity.testFuntion(MainActivity.java:393)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at android.view.View$1.onClick(View.java:3964)
            at android.view.View.performClick(View.java:4633)
            at android.view.View$PerformClick.run(View.java:19330)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
            at dalvik.system.NativeStart.main(Native Method)

您可以使用getSupportFragmentManager()获取片段。 请仔细检查您的FragmentPage1是否扩展了android.support.v4.app.Fragment; 不是
android.Fragment

使用
导入android.support.v4.app.Fragment
代替
导入android.app.Fragment

请将此添加到gradle依赖项中

compile 'com.android.support:support-v4:22.1.1' 
编辑:请使用findFragmentById(R.id.fragment\u page1)代替R.layout

FragmentPage1 fragmentPage1 = (FragmentPage1) getSupportFragmentManager().findFragmentById(R.id.fragment_page1);

更新SDK和存储库后,出现了新的问题。我不能再构建了,我不想在23级编译:(


您使用了自动生成的R文件中的错误静态值

与使用引用XML资源的R.layout.fragment_page1不同,您应该使用R.id.fragment_page1,它应该是位于/res/layout/activity_main.XML的R.layout.activity_主XML文件中片段的id

  • R.layout引用XML布局文件
  • R.id引用单个XML节点(视图、片段等)
简言之,改变:

FragmentPage1 fragmentPage1 = (FragmentPage1) getSupportFragmentManager().findFragmentById(R.layout.fragment_page1);
致:

并确保/res/layout/activity_main.xml中的片段id设置为R.id.fragment_page1,如下所示:


我还找到了另一个答案,我认为这是最令人满意的:)

我忘了提到还有一节课。这一切都来自于一段愚蠢的滑动视图示例代码,它可以在developers.google.com上找到

每次我试图使用愚蠢的getItem(int I)方法通过TabPagerAdapter类访问FragmentPages时,我都会创建一个新的Fragment():-/非常恼人

来自坏谷歌示例的类选项卡SPAGERAAdapter

public class TabsPagerAdapter extends FragmentPagerAdapter {    

    public TabsPagerAdapter(FragmentManager fm, MainActivity mainActivity){
        super(fm);
    }

    // page index, fragment selector
    @Override
    public Fragment getItem(int index) {

        switch (index)
        {
            case 0: return new FragmentPage1(); // bad practice
            case 1: return new FragmentPage2(); // why should one do that?
            case 2: return new FragmentPage3(); 
        }
        return null;
    }

    @Override
    public int getCount() {
        return 3;
    }
}
public class FragmentPage extends Fragment {

    protected MainActivity mainActivity;

    // layout resource
    protected int layoutResource;

    // view
    protected View rootView;

    //Admob
    protected AdView adBanner;
    protected int adBannerResource;
    protected int adBannerLayoutResource;


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

        onCreate(inflater, container);

        return rootView;
    }

    // manage common onCreate things
    protected void onCreate(LayoutInflater inflater, ViewGroup container)
    {
        rootView = inflater.inflate(layoutResource, container, false);

        // admob banner
        adBanner = (AdView) rootView.findViewById(adBannerResource);
        adBanner.setAdListener(new AdListener() {

            @Override
            public void onAdLoaded() {
            }

            @Override
            public void onAdOpened() {
            }

            @Override
            public void onAdClosed() {
                newAdBannerRequest();
            }

            @Override
            public void onAdFailedToLoad(int errorCode) {
                newAdBannerRequest();
            }

            @Override
            public void onAdLeftApplication() {
            }
        });

        if(mainActivity.showAdBanners())
        {
            newAdBannerRequest();
            showAdBanner();
        }
        else
            hideAdBanner();
    }


    // ADMOB
    public void newAdBannerRequest()
    {
        AdRequest request = new AdRequest.Builder()
                .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)        // All emulators
                .addTestDevice("XXXXXXXXXXXXXXXXXXXXXXXXXX")  // My Galaxy Nexus test phone
                .build();
        adBanner.loadAd(request);
    }

    public void showAdBanner()
    {
        GridLayout adBannerLayout = (GridLayout) rootView.findViewById(adBannerLayoutResource);
        if(adBannerLayout.getVisibility() == GridLayout.GONE)
            adBannerLayout.setVisibility(GridLayout.VISIBLE);
    }

    public void hideAdBanner()
    {
        GridLayout adBannerLayout = (GridLayout) rootView.findViewById(adBannerLayoutResource);
        if(adBannerLayout.getVisibility() == GridLayout.VISIBLE)
            adBannerLayout.setVisibility(GridLayout.GONE);
    }


    // GETTERS
    public AdView getAdBanner() { return adBanner;}
    public View getRootView() { return rootView;}


    // SETTERS
    public void setMainActivity(MainActivity mainActivity) {this.mainActivity = mainActivity;}
    public void setLayoutResource(int layoutResource){this.layoutResource = layoutResource;}
    public void setAdBannerResource(int adBannerResource){this.adBannerResource = adBannerResource;}
    public void setAdBannerLayoutResource(int adBannerLayoutResource){this.adBannerLayoutResource = adBannerLayoutResource;}
}
public class FragmentSettingsPage extends FragmentPage {

    // Preferences
    public static final String PREFS_NAME = "Preferences";

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

        super.onCreate(inflater, container);

        SharedPreferences preferences = mainActivity.getSharedPreferences(PREFS_NAME, 0);
        // do some other top secret stuff here ;)


        return rootView;
    }
}
真是一派胡言^^我只是把它抄了一遍,然后完全忘记了它的存在;)

将片段的实例关联移动到构造函数,并保留它们以供以后使用。现在效果很好

优化后的类选项卡SPAGERAAdapter

    public class TabsPagerAdapter extends FragmentPagerAdapter {

    // hosted fragments
    private FragmentPage fragmentPageBasic;
    private FragmentPage fragmentPageAdvanced;
    private FragmentPage fragmentPageSettings;

    //constructor
    public TabsPagerAdapter(FragmentManager fm, MainActivity mainActivity){
        super(fm);

        fragmentPageBasic = new FragmentPage();
        fragmentPageBasic.setMainActivity(mainActivity);
        fragmentPageBasic.setLayoutResource(R.layout.fragment_page1);
        fragmentPageBasic.setAdBannerResource(R.id.adBannerBasic);
        fragmentPageBasic.setAdBannerLayoutResource(R.id.adBannerBasicLayout);

        fragmentPageAdvanced = new FragmentPage();
        fragmentPageAdvanced.setMainActivity(mainActivity);
        fragmentPageAdvanced.setLayoutResource(R.layout.fragment_page2);
        fragmentPageAdvanced.setAdBannerResource(R.id.adBannerAdvanced);
        fragmentPageAdvanced.setAdBannerLayoutResource(R.id.adBannerAdvancedLayout);

        fragmentPageSettings = new FragmentSettingsPage();
        fragmentPageSettings.setMainActivity(mainActivity);
        fragmentPageSettings.setLayoutResource(R.layout.fragment_page3);
        fragmentPageSettings.setAdBannerResource(R.id.adBannerSettings);
        fragmentPageSettings.setAdBannerLayoutResource(R.id.adBannerSettingsLayout);
    }

    // page index, fragment selector
    @Override
    public Fragment getItem(int index) {

        switch (index)
        {
            case 0: return fragmentPageBasic;
            case 1: return fragmentPageAdvanced;
            case 2: return fragmentPageSettings;
        }
        return null;
    }

    @Override
    public int getCount() {
        return 3;
    }

    // GETTERS
    public FragmentPage getFragmentPageBasic() {return fragmentPageBasic;}
    public FragmentPage getFragmentPageAdvanced() {return fragmentPageAdvanced;}
    public FragmentPage getFragmentPageSettings() {return fragmentPageSettings;}

}
当然,现在只有FragmentPage和FragmentSettingsPage(扩展FragmentPage以覆盖OnCreateView方法),而不是有多余的FragmentPage1、Fragment2、FragmentPage3类,这使得代码更清晰、更易于理解

类碎片页面

public class TabsPagerAdapter extends FragmentPagerAdapter {    

    public TabsPagerAdapter(FragmentManager fm, MainActivity mainActivity){
        super(fm);
    }

    // page index, fragment selector
    @Override
    public Fragment getItem(int index) {

        switch (index)
        {
            case 0: return new FragmentPage1(); // bad practice
            case 1: return new FragmentPage2(); // why should one do that?
            case 2: return new FragmentPage3(); 
        }
        return null;
    }

    @Override
    public int getCount() {
        return 3;
    }
}
public class FragmentPage extends Fragment {

    protected MainActivity mainActivity;

    // layout resource
    protected int layoutResource;

    // view
    protected View rootView;

    //Admob
    protected AdView adBanner;
    protected int adBannerResource;
    protected int adBannerLayoutResource;


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

        onCreate(inflater, container);

        return rootView;
    }

    // manage common onCreate things
    protected void onCreate(LayoutInflater inflater, ViewGroup container)
    {
        rootView = inflater.inflate(layoutResource, container, false);

        // admob banner
        adBanner = (AdView) rootView.findViewById(adBannerResource);
        adBanner.setAdListener(new AdListener() {

            @Override
            public void onAdLoaded() {
            }

            @Override
            public void onAdOpened() {
            }

            @Override
            public void onAdClosed() {
                newAdBannerRequest();
            }

            @Override
            public void onAdFailedToLoad(int errorCode) {
                newAdBannerRequest();
            }

            @Override
            public void onAdLeftApplication() {
            }
        });

        if(mainActivity.showAdBanners())
        {
            newAdBannerRequest();
            showAdBanner();
        }
        else
            hideAdBanner();
    }


    // ADMOB
    public void newAdBannerRequest()
    {
        AdRequest request = new AdRequest.Builder()
                .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)        // All emulators
                .addTestDevice("XXXXXXXXXXXXXXXXXXXXXXXXXX")  // My Galaxy Nexus test phone
                .build();
        adBanner.loadAd(request);
    }

    public void showAdBanner()
    {
        GridLayout adBannerLayout = (GridLayout) rootView.findViewById(adBannerLayoutResource);
        if(adBannerLayout.getVisibility() == GridLayout.GONE)
            adBannerLayout.setVisibility(GridLayout.VISIBLE);
    }

    public void hideAdBanner()
    {
        GridLayout adBannerLayout = (GridLayout) rootView.findViewById(adBannerLayoutResource);
        if(adBannerLayout.getVisibility() == GridLayout.VISIBLE)
            adBannerLayout.setVisibility(GridLayout.GONE);
    }


    // GETTERS
    public AdView getAdBanner() { return adBanner;}
    public View getRootView() { return rootView;}


    // SETTERS
    public void setMainActivity(MainActivity mainActivity) {this.mainActivity = mainActivity;}
    public void setLayoutResource(int layoutResource){this.layoutResource = layoutResource;}
    public void setAdBannerResource(int adBannerResource){this.adBannerResource = adBannerResource;}
    public void setAdBannerLayoutResource(int adBannerLayoutResource){this.adBannerLayoutResource = adBannerLayoutResource;}
}
public class FragmentSettingsPage extends FragmentPage {

    // Preferences
    public static final String PREFS_NAME = "Preferences";

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

        super.onCreate(inflater, container);

        SharedPreferences preferences = mainActivity.getSharedPreferences(PREFS_NAME, 0);
        // do some other top secret stuff here ;)


        return rootView;
    }
}
类碎片设置页面

public class TabsPagerAdapter extends FragmentPagerAdapter {    

    public TabsPagerAdapter(FragmentManager fm, MainActivity mainActivity){
        super(fm);
    }

    // page index, fragment selector
    @Override
    public Fragment getItem(int index) {

        switch (index)
        {
            case 0: return new FragmentPage1(); // bad practice
            case 1: return new FragmentPage2(); // why should one do that?
            case 2: return new FragmentPage3(); 
        }
        return null;
    }

    @Override
    public int getCount() {
        return 3;
    }
}
public class FragmentPage extends Fragment {

    protected MainActivity mainActivity;

    // layout resource
    protected int layoutResource;

    // view
    protected View rootView;

    //Admob
    protected AdView adBanner;
    protected int adBannerResource;
    protected int adBannerLayoutResource;


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

        onCreate(inflater, container);

        return rootView;
    }

    // manage common onCreate things
    protected void onCreate(LayoutInflater inflater, ViewGroup container)
    {
        rootView = inflater.inflate(layoutResource, container, false);

        // admob banner
        adBanner = (AdView) rootView.findViewById(adBannerResource);
        adBanner.setAdListener(new AdListener() {

            @Override
            public void onAdLoaded() {
            }

            @Override
            public void onAdOpened() {
            }

            @Override
            public void onAdClosed() {
                newAdBannerRequest();
            }

            @Override
            public void onAdFailedToLoad(int errorCode) {
                newAdBannerRequest();
            }

            @Override
            public void onAdLeftApplication() {
            }
        });

        if(mainActivity.showAdBanners())
        {
            newAdBannerRequest();
            showAdBanner();
        }
        else
            hideAdBanner();
    }


    // ADMOB
    public void newAdBannerRequest()
    {
        AdRequest request = new AdRequest.Builder()
                .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)        // All emulators
                .addTestDevice("XXXXXXXXXXXXXXXXXXXXXXXXXX")  // My Galaxy Nexus test phone
                .build();
        adBanner.loadAd(request);
    }

    public void showAdBanner()
    {
        GridLayout adBannerLayout = (GridLayout) rootView.findViewById(adBannerLayoutResource);
        if(adBannerLayout.getVisibility() == GridLayout.GONE)
            adBannerLayout.setVisibility(GridLayout.VISIBLE);
    }

    public void hideAdBanner()
    {
        GridLayout adBannerLayout = (GridLayout) rootView.findViewById(adBannerLayoutResource);
        if(adBannerLayout.getVisibility() == GridLayout.VISIBLE)
            adBannerLayout.setVisibility(GridLayout.GONE);
    }


    // GETTERS
    public AdView getAdBanner() { return adBanner;}
    public View getRootView() { return rootView;}


    // SETTERS
    public void setMainActivity(MainActivity mainActivity) {this.mainActivity = mainActivity;}
    public void setLayoutResource(int layoutResource){this.layoutResource = layoutResource;}
    public void setAdBannerResource(int adBannerResource){this.adBannerResource = adBannerResource;}
    public void setAdBannerLayoutResource(int adBannerLayoutResource){this.adBannerLayoutResource = adBannerLayoutResource;}
}
public class FragmentSettingsPage extends FragmentPage {

    // Preferences
    public static final String PREFS_NAME = "Preferences";

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

        super.onCreate(inflater, container);

        SharedPreferences preferences = mainActivity.getSharedPreferences(PREFS_NAME, 0);
        // do some other top secret stuff here ;)


        return rootView;
    }
}

有没有进一步改进的方法?

在哪一行获得NullPointerException?向我们展示stackTracePlease发布您的logcat错误输出。将片段添加到活动时,行在哪里?我已经添加了logcat输出。testFunction()中的scond行抛出NullPointerException<代码>GridLayout GridLayout=(GridLayout)fragmentPage1.getRootView().findViewById(R.id.adBannerBasicLayout)fragmentPage1始终为空…我使用
import android.support.v4.app.Fragment
并尝试了
公共类FragmentPage1扩展了android.support.v4.app.Fragment
,但出现了相同的错误:(包括
compile'com.android.support:support-v4:22.1.1'
到apps build.gradle文件。但仍然存在相同的错误。请更新您的sdk和存储库o,许多小时后,现在我终于使用sdk级别23进行编译了^在将整个代码与Lv 23对齐后,我终于在我的应用程序中找到了导致问题的错误代码:)