Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.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 使用FragmentPagerAdapter创建片段时,在运行时更改片段可见性_Java_Android_Android Fragments_Visibility_Fragmentpageradapter - Fatal编程技术网

Java 使用FragmentPagerAdapter创建片段时,在运行时更改片段可见性

Java 使用FragmentPagerAdapter创建片段时,在运行时更改片段可见性,java,android,android-fragments,visibility,fragmentpageradapter,Java,Android,Android Fragments,Visibility,Fragmentpageradapter,我正在尝试创建我的第一个Android应用程序,它看起来如下所示:有一个主活动包含多个由FragmentPagerAdapter初始化的片段。还有另一个活动(SettingsActivity),我想列出所有片段名称,并允许隐藏其中的一些。要隐藏它们,我要使用以下命令: FragmentManager fm=getFragmentManager(); Fragment myFragment=fm.findFragmentByTag("tag"); fm.beginTransaction().hid

我正在尝试创建我的第一个Android应用程序,它看起来如下所示:有一个主活动包含多个由FragmentPagerAdapter初始化的片段。还有另一个活动(SettingsActivity),我想列出所有片段名称,并允许隐藏其中的一些。要隐藏它们,我要使用以下命令:

FragmentManager fm=getFragmentManager();
Fragment myFragment=fm.findFragmentByTag("tag");
fm.beginTransaction().hide(myFragment).commit();
问题是我不知道片段id或标记,不确定它们是否存在。我怎样才能得到它们?我是否应该切换到XML定义以使其成为可能

适配器:

public class TabsPagerAdapter extends FragmentPagerAdapter {

public TabsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int index) {
    switch (index){
    case 0:
        return new CoverFragment();
    case 1:
        return new NumbersConverterFragment();
    case 2:
        return new TempConverterFragment();
    case 3:
        return new LengthConverterFragment();
    case 4:
        return new AreaConverterFragment();
    case 5:
        return new VolumeConverterFragment();
    case 6:
        return new WeightConverterFragment();
    case 7:
        return new SpeedConverterFragment();
    }
    return null;
}

@Override
public int getCount() {
    return 8;
}
主要活动:

public class MainActivity extends FragmentActivity implements ActionBar.TabListener {

private ViewPager viewPager;
private TabsPagerAdapter tabsPagerAdapter;
private ActionBar actionBar;

@Override
protected void onCreate(Bundle savedInstanceState) {

   String[] tabs={getString(R.string.title_section0), getString(R.string.title_section1),getString(R.string.title_section2)};

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

    viewPager=(ViewPager) findViewById(R.id.pager);
    actionBar=getActionBar();
    tabsPagerAdapter=new TabsPagerAdapter(getSupportFragmentManager());

    viewPager.setAdapter(tabsPagerAdapter);
    actionBar.setHomeButtonEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    for(String tab : tabs){
    actionBar.addTab(actionBar.newTab().setText(tab).setTabListener(this));
    }


    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            // on changing the page
            // make respected tab selected
            actionBar.setSelectedNavigationItem(position);
        }
     ...
    });

}
片段布局:

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#fbfdfb"
    >


     <TextView android:text="@string/celsius_" android:id="@+id/textView1" 
      android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
    <EditText android:text="" android:id="@+id/txtCelsius" android:layout_width="match_parent" 
      android:layout_height="wrap_content"></EditText>

    <TextView android:text="@string/fahrenheit_" android:id="@+id/textView1" 
      android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
    <EditText android:text="" android:id="@+id/txtFahrenheit" android:layout_width="match_parent" 
      android:layout_height="wrap_content"></EditText>

    <TextView android:text="@string/kelvin_" android:id="@+id/textView1" 
      android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
    <EditText android:text="" android:id="@+id/txtKelvin" android:layout_width="match_parent" 
      android:layout_height="wrap_content"></EditText>    

 </LinearLayout>

提前感谢。

如果SettingsActivity不是持有FragmentPagerAdapter的活动,那么您必须重新创建所有片段。片段的性质与它的活动密切相关

如果SettingsActivity是持有FragmentPagerAdapter的活动,那么我记得,FragmentPagerAdapter将尽快初始化所有8个片段,以便在您刷卡时准备好它们,这与FragmentStatePagerAdapter不同。这意味着您(我认为)应该能够在构造函数TabsPagerAdapter中创建每个片段,并保留对它们的引用,您可以使用TabsPagerAdapter上的getter方法访问它们

以下是如何轻松访问pageradapter片段的示例:

public class DisplayPagerAdapter extends FragmentStatePagerAdapter {

    private static final String TAG = "DisplayPagerAdapter";

    SparseArray<DisplayFragment> registeredFragments = new SparseArray<DisplayFragment>();

    @Inject DisplayCoreModule display;

    public DisplayPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return (display != null && display.getPagesCount() > 0) ? display.getPagesCount() : 1;
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }


    @Override
    public Fragment getItem(int position) {
        Log.d(TAG, "getItem " + position);
        return DisplayFragment.newInstance(position); 
    }

    @Override
    public CharSequence getPageTitle(int position) {
        if (display != null && display.getPagesCount() > 0) {
            return "Side " + (position+1);
        } else {
            return super.getPageTitle(position);
        }
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Log.d(TAG, "instantiateItem " + position);
        DisplayFragment fragment = (DisplayFragment) super.instantiateItem(container, position);
        registeredFragments.put(position, fragment);
        return fragment;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        Log.d(TAG, "destroyItem " + position);
        registeredFragments.remove(position);
        super.destroyItem(container, position, object);
    }

    public Fragment getRegisteredFragment(int position) {
        return registeredFragments.get(position);
    }

    public SparseArray<DisplayFragment> getRegisteredFragments() {
        return registeredFragments;
    }


}
注意
findFragmentById
的使用。标记通常用于动态添加的片段(至少在我看来)。如果在XML布局中定义了一个片段,那么
findFragmentById
肯定会返回一个片段,但需要明确的是,它将是该片段的一个新实例

回答您的问题:

如果我将片段移动到主活动XML中会怎么样?这不会让事情变得更简单吗

不要这样认为,更新后的答案显示了如何轻松访问片段(从您的主要活动中)

虽然我不确定是否可以在设置活动中使用FragmentManager

当然可以。您可以添加新片段,访问可用片段(使用findById从预定义的XML或使用findByTag动态添加)。但是,您不能访问由主活动保留的片段的相同实例

为了在片段和两个活动之间共享信息,您需要以某种方式保持片段的状态(这是一个不同的主题)


总而言之,我认为您走的是正确的道路,您只需要将拼图的正确部分组合起来:)

谢谢!我没有注意到碎片与活动有关。SettingsActivity不支持适配器。你说“必须重新创建碎片”是什么意思?如果我将片段移动到主活动XML中会怎么样?这不会让事情变得更简单吗?我可以先访问活动来访问他们的id-findViewById(R.id.No problem:)用一些希望有用的东西更新了我的答案非常感谢您提供的示例。我意识到我做错了什么。我会在一两天后继续。没问题,很乐意帮忙:)
public class DisplayPagerAdapter extends FragmentStatePagerAdapter {

    private static final String TAG = "DisplayPagerAdapter";

    SparseArray<DisplayFragment> registeredFragments = new SparseArray<DisplayFragment>();

    @Inject DisplayCoreModule display;

    public DisplayPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return (display != null && display.getPagesCount() > 0) ? display.getPagesCount() : 1;
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }


    @Override
    public Fragment getItem(int position) {
        Log.d(TAG, "getItem " + position);
        return DisplayFragment.newInstance(position); 
    }

    @Override
    public CharSequence getPageTitle(int position) {
        if (display != null && display.getPagesCount() > 0) {
            return "Side " + (position+1);
        } else {
            return super.getPageTitle(position);
        }
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Log.d(TAG, "instantiateItem " + position);
        DisplayFragment fragment = (DisplayFragment) super.instantiateItem(container, position);
        registeredFragments.put(position, fragment);
        return fragment;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        Log.d(TAG, "destroyItem " + position);
        registeredFragments.remove(position);
        super.destroyItem(container, position, object);
    }

    public Fragment getRegisteredFragment(int position) {
        return registeredFragments.get(position);
    }

    public SparseArray<DisplayFragment> getRegisteredFragments() {
        return registeredFragments;
    }


}
FragmentManager fm=getFragmentManager();
Fragment myFragment=fm.findFragmentById(R.id.frag_tempconverter)
fm.beginTransaction().hide(myFragment).commit();