首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ViewPager和片段 - 存储片段状态的正确方法是什么?

ViewPager和片段 - 存储片段状态的正确方法是什么?

提问于 2017-12-19 06:45:41
回答 2关注 0查看 564

片段似乎是非常好的UI界面逻辑分成一些模块。但是随着ViewPager它的生命周期对我来说还是朦胧的。所以大师的想法是非常需要的!

编辑

看到下面的愚蠢的解决方案;-)

范围

主要活动有一个ViewPager片段。这些片段可以为其他(子域)活动实现一些不同的逻辑,所以片段的数据通过活动内的回调接口填充。而一切正常的第一次发射,但!!

问题

当活动被重新创建(例如在方向改变时),所以做ViewPager的碎片。代码(你会发现下面)说,每当创建活动,我尝试创建一个新的ViewPager片段适配器相同的片段(也许这是问题),但FragmentManager已经有所有这些片段存储的地方(?)和启动这些娱乐机制。因此,娱乐机制调用onAttach,onCreateView等“旧”片段与我的回调接口调用启动数据通过活动的实施方法。但是这个方法指向通过Activity的onCreate方法创建的新创建的片段。

问题

也许我正在使用错误的模式,但即使Android 3 Pro书也没有太多的关于它。所以,请给我一个两拳,指出如何正确的做法。非常感谢!

主要活动

代码语言:txt
复制
代码语言:txt
AI代码解释
复制
public class DashboardActivity extends BasePagerActivity implements OnMessageListActionListener {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
private MessagesFragment mMessagesFragment;
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
@Override
代码语言:txt
AI代码解释
复制
protected void onCreate(Bundle savedInstanceState) {
代码语言:txt
AI代码解释
复制
    Logger.d("Dash onCreate");
代码语言:txt
AI代码解释
复制
    super.onCreate(savedInstanceState);
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    setContentView(R.layout.viewpager_container);
代码语言:txt
AI代码解释
复制
    new DefaultToolbar(this);
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    // create fragments to use
代码语言:txt
AI代码解释
复制
    mMessagesFragment = new MessagesFragment();
代码语言:txt
AI代码解释
复制
    mStreamsFragment = new StreamsFragment();
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    // set titles and fragments for view page
代码语言:txt
AI代码解释
复制
    Map<String, Fragment> screens = new LinkedHashMap<String, Fragment>();
代码语言:txt
AI代码解释
复制
    screens.put(getApplicationContext().getString(R.string.dashboard_title_dumb), new DumbFragment());
代码语言:txt
AI代码解释
复制
    screens.put(getApplicationContext().getString(R.string.dashboard_title_messages), mMessagesFragment);
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    // instantiate view pager via adapte
代码语言:txt
AI代码解释
复制
    mPager = (ViewPager) findViewById(R.id.viewpager_pager);
代码语言:txt
AI代码解释
复制
    mPagerAdapter = new BasePagerAdapter(screens, getSupportFragmentManager());
代码语言:txt
AI代码解释
复制
    mPager.setAdapter(mPagerAdapter);
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    // set title indicato
代码语言:txt
AI代码解释
复制
    TitlePageIndicator indicator = (TitlePageIndicator) findViewById(R.id.viewpager_titles);
代码语言:txt
AI代码解释
复制
    indicator.setViewPager(mPager, 1);
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
}
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
/* set of fragments callback interface implementations */
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
@Override
代码语言:txt
AI代码解释
复制
public void onMessageInitialisation() {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    Logger.d("Dash onMessageInitialisation");
代码语言:txt
AI代码解释
复制
    if (mMessagesFragment != null)
代码语言:txt
AI代码解释
复制
        mMessagesFragment.loadLastMessages();
代码语言:txt
AI代码解释
复制
}
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
@Override
代码语言:txt
AI代码解释
复制
public void onMessageSelected(Message selectedMessage) {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    Intent intent = new Intent(this, StreamActivity.class);
代码语言:txt
AI代码解释
复制
    intent.putExtra(Message.class.getName(), selectedMessage);
代码语言:txt
AI代码解释
复制
    startActivity(intent);
代码语言:txt
AI代码解释
复制
}

BasePagerActivity又名助手

代码语言:txt
复制
代码语言:txt
AI代码解释
复制
public class BasePagerActivity extends FragmentActivity {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
BasePagerAdapter mPagerAdapter;
代码语言:txt
AI代码解释
复制
ViewPager mPager;
代码语言:txt
AI代码解释
复制
}

适配器

代码语言:txt
AI代码解释
复制
public class BasePagerAdapter extends FragmentPagerAdapter implements TitleProvider {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
private Map<String, Fragment> mScreens;
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
public BasePagerAdapter(Map<String, Fragment> screenMap, FragmentManager fm) {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    super(fm);
代码语言:txt
AI代码解释
复制
    this.mScreens = screenMap;
代码语言:txt
AI代码解释
复制
}
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
@Override
代码语言:txt
AI代码解释
复制
public Fragment getItem(int position) {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    return mScreens.values().toArray(new Fragment[mScreens.size()])[position];
代码语言:txt
AI代码解释
复制
}
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
@Override
代码语言:txt
AI代码解释
复制
public int getCount() {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    return mScreens.size();
代码语言:txt
AI代码解释
复制
}
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
@Override
代码语言:txt
AI代码解释
复制
public String getTitle(int position) {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    return mScreens.keySet().toArray(new String[mScreens.size()])[position];
代码语言:txt
AI代码解释
复制
}
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
// hack. we don't want to destroy our fragments and re-initiate them afte
代码语言:txt
AI代码解释
复制
@Override
代码语言:txt
AI代码解释
复制
public void destroyItem(View container, int position, Object object) {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    // TODO Auto-generated method stub
代码语言:txt
AI代码解释
复制
}
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
}

分段

代码语言:txt
AI代码解释
复制
public class MessagesFragment extends ListFragment {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
private boolean mIsLastMessages;
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
private List<Message> mMessagesList;
代码语言:txt
AI代码解释
复制
private MessageArrayAdapter mAdapter;
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
private LoadMessagesTask mLoadMessagesTask;
代码语言:txt
AI代码解释
复制
private OnMessageListActionListener mListener;
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
// define callback interface
代码语言:txt
AI代码解释
复制
public interface OnMessageListActionListener {
代码语言:txt
AI代码解释
复制
    public void onMessageInitialisation();
代码语言:txt
AI代码解释
复制
    public void onMessageSelected(Message selectedMessage);
代码语言:txt
AI代码解释
复制
}
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
@Override
代码语言:txt
AI代码解释
复制
public void onAttach(Activity activity) {
代码语言:txt
AI代码解释
复制
    super.onAttach(activity);
代码语言:txt
AI代码解释
复制
    // setting callback
代码语言:txt
AI代码解释
复制
    mListener = (OnMessageListActionListener) activity;
代码语言:txt
AI代码解释
复制
    mIsLastMessages = activity instanceof DashboardActivity;
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
}
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
@Override
代码语言:txt
AI代码解释
复制
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
代码语言:txt
AI代码解释
复制
    inflater.inflate(R.layout.fragment_listview, container);
代码语言:txt
AI代码解释
复制
    mProgressView = inflater.inflate(R.layout.listrow_progress, null);
代码语言:txt
AI代码解释
复制
    mEmptyView = inflater.inflate(R.layout.fragment_nodata, null);
代码语言:txt
AI代码解释
复制
    return super.onCreateView(inflater, container, savedInstanceState);
代码语言:txt
AI代码解释
复制
}
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
@Override
代码语言:txt
AI代码解释
复制
public void onActivityCreated(Bundle savedInstanceState) {
代码语言:txt
AI代码解释
复制
    super.onActivityCreated(savedInstanceState);
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    // instantiate loading task
代码语言:txt
AI代码解释
复制
    mLoadMessagesTask = new LoadMessagesTask();
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    // instantiate list of messages
代码语言:txt
AI代码解释
复制
    mMessagesList = new ArrayList<Message>();
代码语言:txt
AI代码解释
复制
    mAdapter = new MessageArrayAdapter(getActivity(), mMessagesList);
代码语言:txt
AI代码解释
复制
    setListAdapter(mAdapter);
代码语言:txt
AI代码解释
复制
}
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
@Override
代码语言:txt
AI代码解释
复制
public void onResume() {
代码语言:txt
AI代码解释
复制
    mListener.onMessageInitialisation();
代码语言:txt
AI代码解释
复制
    super.onResume();
代码语言:txt
AI代码解释
复制
}
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
public void onListItemClick(ListView l, View v, int position, long id) {
代码语言:txt
AI代码解释
复制
    Message selectedMessage = (Message) getListAdapter().getItem(position);
代码语言:txt
AI代码解释
复制
    mListener.onMessageSelected(selectedMessage);
代码语言:txt
AI代码解释
复制
    super.onListItemClick(l, v, position, id);
代码语言:txt
AI代码解释
复制
}
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
/* public methods to load messages from host acitivity, etc... */
代码语言:txt
AI代码解释
复制
}

方案

愚蠢的解决方案是用putFragment将片段保存在onSaveInstanceState(主机Activity)中,并通过getFragment将它们放入onCreate中。但我仍然有一种奇怪的感觉,事情不应该这样...请参阅下面的代码:

代码语言:txt
AI代码解释
复制
    @Override
代码语言:txt
AI代码解释
复制
protected void onSaveInstanceState(Bundle outState) {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    super.onSaveInstanceState(outState);
代码语言:txt
AI代码解释
复制
    getSupportFragmentManager()
代码语言:txt
AI代码解释
复制
            .putFragment(outState, MessagesFragment.class.getName(), mMessagesFragment);
代码语言:txt
AI代码解释
复制
}
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
protected void onCreate(Bundle savedInstanceState) {
代码语言:txt
AI代码解释
复制
    Logger.d("Dash onCreate");
代码语言:txt
AI代码解释
复制
    super.onCreate(savedInstanceState);
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    ...
代码语言:txt
AI代码解释
复制
    // create fragments to use
代码语言:txt
AI代码解释
复制
    if (savedInstanceState != null) {
代码语言:txt
AI代码解释
复制
        mMessagesFragment = (MessagesFragment) getSupportFragmentManager().getFragment(
代码语言:txt
AI代码解释
复制
                savedInstanceState, MessagesFragment.class.getName());
代码语言:txt
AI代码解释
复制
                StreamsFragment.class.getName());
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
    if (mMessagesFragment == null)
代码语言:txt
AI代码解释
复制
        mMessagesFragment = new MessagesFragment();
代码语言:txt
AI代码解释
复制
    ...
代码语言:txt
AI代码解释
复制
}

回答 2

嗨喽你好

发布于 2017-12-19 07:04:56

我想提供一个可扩展的解决方案antonyt的精彩的回答和压倒一切的提FragmentPageAdapter.instantiateItem(View, int)保存到创建的引用Fragments,所以你可以对他们以后做的工作。这也应该与FragmentStatePagerAdapter; 请参阅说明的细节。

下面是一个简单的例子,如何得到一个不依赖于内部设置的Fragments返回的引用。关键是重写和保存在那里的引用,而不是在。

代码语言:txt
复制
代码语言:txt
复制
FragmentPagerAdaptertagsFragmentsinstantiateItem()getItem()
代码语言:txt
复制
代码语言:txt
复制
public class SomeActivity extends Activity {
代码语言:txt
复制
    private FragmentA m1stFragment;
代码语言:txt
复制
    private FragmentB m2ndFragment;
代码语言:txt
复制
代码语言:txt
复制
    // other code in your Activity...
代码语言:txt
复制
代码语言:txt
复制
    private class CustomPagerAdapter extends FragmentPagerAdapter {
代码语言:txt
复制
        // other code in your custom FragmentPagerAdapter...
代码语言:txt
复制
代码语言:txt
复制
        public CustomPagerAdapter(FragmentManager fm) {
代码语言:txt
复制
            super(fm);
代码语言:txt
复制
        }
代码语言:txt
复制
代码语言:txt
复制
        @Override
代码语言:txt
复制
        public Fragment getItem(int position) {
代码语言:txt
复制
            // Do NOT try to save references to the Fragments in getItem(),
代码语言:txt
复制
            // because getItem() is not always called. If the Fragment
代码语言:txt
复制
            // was already created then it will be retrieved from the FragmentMange
代码语言:txt
复制
            // and not here (i.e. getItem() won't be called again).
代码语言:txt
复制
            switch (position) {
代码语言:txt
复制
                case 0:
代码语言:txt
复制
                    return new FragmentA();
代码语言:txt
复制
                case 1:
代码语言:txt
复制
                    return new FragmentB();
代码语言:txt
复制
                default:
代码语言:txt
复制
                    // This should never happen. Always account for each position above
代码语言:txt
复制
                    return null;
代码语言:txt
复制
            }
代码语言:txt
复制
        }
代码语言:txt
复制
代码语言:txt
复制
        // Here we can finally safely save a reference to the created
代码语言:txt
复制
        // Fragment, no matter where it came from (either getItem() o
代码语言:txt
复制
        // FragmentManger). Simply save the returned Fragment from
代码语言:txt
复制
        // super.instantiateItem() into an appropriate reference depending
代码语言:txt
复制
        // on the ViewPager position.
代码语言:txt
复制
        @Override
代码语言:txt
复制
        public Object instantiateItem(ViewGroup container, int position) {
代码语言:txt
复制
            Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
代码语言:txt
复制
            // save the appropriate reference depending on position
代码语言:txt
复制
            switch (position) {
代码语言:txt
复制
                case 0:
代码语言:txt
复制
                    m1stFragment = (FragmentA) createdFragment;
代码语言:txt
复制
                    break;
代码语言:txt
复制
                case 1:
代码语言:txt
复制
                    m2ndFragment = (FragmentB) createdFragment;
代码语言:txt
复制
                    break;
代码语言:txt
复制
            }
代码语言:txt
复制
            return createdFragment;
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
代码语言:txt
复制
    public void someMethod() {
代码语言:txt
复制
        // do work on the referenced Fragments, but first check if they
代码语言:txt
复制
        // even exist yet, otherwise you'll get an NPE.
代码语言:txt
复制
代码语言:txt
复制
        if (m1stFragment != null) {
代码语言:txt
复制
            // m1stFragment.doWork();
代码语言:txt
复制
        }
代码语言:txt
复制
代码语言:txt
复制
        if (m2ndFragment != null) {
代码语言:txt
复制
            // m2ndFragment.doSomeWorkToo();
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
}

或者如果你喜欢使用tags而不是类成员变量/引用,Fragments你也可以以相同的方式抓取tags设置FragmentPagerAdapter:注意:这不适用于创建它时FragmentStatePagerAdapter不设置。tagsFragments

代码语言:txt
复制
@Override
代码语言:txt
复制
public Object instantiateItem(ViewGroup container, int position) {
代码语言:txt
复制
    Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
代码语言:txt
复制
    // get the tags set by FragmentPagerAdapte
代码语言:txt
复制
    switch (position) {
代码语言:txt
复制
        case 0:
代码语言:txt
复制
            String firstTag = createdFragment.getTag();
代码语言:txt
复制
            break;
代码语言:txt
复制
        case 1:
代码语言:txt
复制
            String secondTag = createdFragment.getTag();
代码语言:txt
复制
            break;
代码语言:txt
复制
    }
代码语言:txt
复制
    // ... save the tags somewhere so you can reference them late
代码语言:txt
复制
    return createdFragment;
代码语言:txt
复制
}

请注意,此方法不依赖于模拟内部tag集合FragmentPagerAdapter,而是使用适当的API来检索它们。这样即使tag未来版本的变化SupportLibrary仍然安全。

不要忘记,根据你的设计Activity,Fragments你正在努力的工作可能还可能不存在,所以你必须null在使用你的参考之前通过检查进行解释。

另外,如果你正在使用FragmentStatePagerAdapter,那么你不想保留对你的强硬引用,Fragments因为你可能有很多这样的引用,而且硬引用会不必要地把它们留在内存中。而应将其保存Fragment在WeakReference变量中而不是标准中。喜欢这个:

代码语言:txt
复制
WeakReference<Fragment> m1stFragment = new WeakReference<Fragment>(createdFragment);
代码语言:txt
复制
// ...and access them like so
代码语言:txt
复制
Fragment firstFragment = m1stFragment.get();
代码语言:txt
复制
if (firstFragment != null) {
代码语言:txt
复制
    // reference hasn't been cleared yet; do work...
代码语言:txt
复制
}

akjok54

发布于 2017-12-19 07:03:51

当FragmentPagerAdapter向FragmentManager添加一个片段时,它将使用一个基于该片段将被放置的特定位置的特殊标签。FragmentPagerAdapter.getItem(int position)仅当该位置的片段不存在时才被调用。在旋转之后,Android会注意到它已经为这个特定的位置创建/保存了一个片段,所以它只是试图与它重新连接FragmentManager.findFragmentByTag(),而不是创建一个新片段。所有这些在使用时都是免费的,这FragmentPagerAdapter也是为什么通常在getItem(int)方法中使用片段初始化代码的原因。

即使我们不使用a FragmentPagerAdapter,每次创建一个新的片段也不是一个好主意Activity.onCreate(Bundle)。正如你已经注意到的那样,当一个片段被添加到FragmentManager中时,它将在旋转后被重新创建,并且不需要再次添加。这样做是在处理碎片时出现错误的常见原因。

处理碎片时常用的方法是:

代码语言:txt
复制
protected void onCreate(Bundle savedInstanceState) {
代码语言:txt
复制
    super.onCreate(savedInstanceState);
代码语言:txt
复制
代码语言:txt
复制
    ...
代码语言:txt
复制
代码语言:txt
复制
    CustomFragment fragment;
代码语言:txt
复制
    if (savedInstanceState != null) {
代码语言:txt
复制
        fragment = (CustomFragment) getSupportFragmentManager().findFragmentByTag("customtag");
代码语言:txt
复制
    } else {
代码语言:txt
复制
        fragment = new CustomFragment();
代码语言:txt
复制
        getSupportFragmentManager().beginTransaction().add(R.id.container, fragment, "customtag").commit(); 
代码语言:txt
复制
    }
代码语言:txt
复制
代码语言:txt
复制
    ...
代码语言:txt
复制
代码语言:txt
复制
}

当使用a时FragmentPagerAdapter,我们放弃片段管理到适配器,并且不必执行上述步骤。默认情况下,它只会在当前位置的前面和后面预加载一个片段(尽管除非您正在使用,否则不会将其破坏FragmentStatePagerAdapter)。这由ViewPager.setOffscreenPageLimit(int)控制。因此,直接调用适配器外部片段的方法并不保证是有效的,因为它们甚至可能不存在。

长话短说,你putFragment以后能够得到一个参考的解决方案并不是那么疯狂,而不是像正常的使用片段的方式(上面)那样。这是很难得到一个参考,否则因为片段是由适配器添加,而不是你个人。只要确保offscreenPageLimit足够高,随时加载你想要的碎片,因为你依靠它存在。这绕过了ViewPager的延迟加载功能,但似乎是您对应用程序的要求。

另一种方法是FragmentPageAdapter.instantiateItem(View, int)在返回超级调用之前覆盖并保存对超级调用返回的片段的引用(如果已经存在,则具有查找片段的逻辑)。

要获得更完整的图片,请查看FragmentPagerAdapter(short)和ViewPager(long)的一些源代码。

和开发者交流更多问题细节吧,去 写回答
相关文章
1049. 数列的片段和(20)
给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段。例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0.3) (0.3, 0.4) (0.4) 这10个片段。
AI那点小事
2020/04/20
3500
1049. 数列的片段和(20)
【PAT乙级】数列的片段和
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
喜欢ctrl的cxk
2019/11/08
4290
文档片段(createDocumentFragment)
1.createDocumentFragment var one = document.getElementById("one"); var k = document.createDocumentFragment(); var p = document.createElement("p"); p.innerHTML = "我们不一样"; k.appendChild(p); one.appendChild(k) console.log(k) //文档里没
天天_哥
2018/09/29
5330
[linux][c/c++]代码片段02
 gcc `pkg-config --cflags gtk+-3.0` -o example-1 example-1.c `pkg-config --libs gtk+-3.0`
landv
2019/11/11
5140
[linux][c/c++]代码片段02
[linux][c/c++]代码片段01
#include <stdio.h> #include <unistd.h> void usage() { printf("Usage:\n"); printf("\tOptDemo [-a] [-b] [-c message]"); } int main(int argc, char *argv[]) { int o; const char *optstring = "abc::"; // 有三个选项-abc,其中c选项后有两个冒号,表示后面可选参数 whi
landv
2019/11/10
6960
php代码片段
获取文件后缀
lilugirl
2019/05/26
4.2K0
1049 数列的片段和 (20 分)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
韩旭051
2019/11/08
4880
MarkDown常用代码片段和工具
markdwon可以支持Html代码,所以很多原生markdown没有的功能,就可以用Html写了。
sean.liu
2022/08/03
3220
HTML代码片段
IE条件注释 <!--[ifIE6]> IE6版本有效 <![endif]--> <!--[if gt IE6]> IE6以上版本有效 <![endif]--> <!--[if gte IE6]> IE6(包含)及以上版本有效 <![endif]--> <!--[if lt IE8]> IE8以下版本有效 <![endif]--> <!--[if lte IE8]> IE8(包含)及以下版本有效 <![endif]--> <!--[if !IE]>--> 除了IE <![endif]--> 用Chrome或
前端GoGoGo
2018/08/27
5.6K0
1049 数列的片段和 (20 分)
给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段。例如,给定数列 { 0.1, 0.2, 0.3, 0.4 },我们有 (0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0.3) (0.3, 0.4) (0.4) 这 10 个片段。
可爱见见
2019/10/13
6450
VSCode 添加用户代码片段,自定义用户代码片段
在使用 VScode 开发中经常会有一些重复使用的代码块,复制粘贴也很麻烦,这时可以在 VScode 中添加用户代码片段,输入简写即可快捷输入。
Cell
2023/09/15
1.1K0
VSCode 添加用户代码片段,自定义用户代码片段
CSS代码片段
见 https://css-tricks.com/snippets/css/media-queries-for-standard-devices/
前端GoGoGo
2018/08/27
9710
Spring代码片段
配置springmvc核心控制器DispatcherServlet web.xml
小锋学长生活大爆炸
2020/11/24
6820
Spring代码片段
nodejs常用代码片段
调用:node index.js --target test 接收:const config=loadConifg(['target'],'--') //config.target----->test
易墨
2018/09/14
9050
前端-JavaScript 有用的代码片段和 trick
解析允许字符串中含有非数字字符,解析按从左到右的顺序,如果遇到非数字字符就停止。而转换不允许出现非数字字符,否者会失败并返回NaN。
grain先森
2019/03/29
1.1K0
Lua代码片段收集
Lua实现闭包 --[[@Func :实现闭包 @Desc : 当一个函数内部嵌套另一个函数定义时,内部的函数体可以访问外部的函数的局部变量,这种特征我们称作词法定界]] function fuck() local i = 0 return function() i = i + 1 return i end end c1 = fuck() print(c1()) print(c1()) 序列化Lua表 -- Desc : 序列化Lua表(Co
晚晴幽草轩轩主
2018/03/27
9710
Shell脚本常用片段
shell脚本时不时就要用到,但是一些常用的片段却没有记住,这里整理一个笔记 常用片段 普通 文件所在目录 CUR_DIR="$(dirname $0)" 基本每个脚本都要用到,否则脚本执行的时候就容易受到当前目录的影响,可能出现执行结果不一致 if-elif-fi if condition; then commands; elif condition; then commands; fi 时间相关 当前时间 date +%Y%m%d%H%M%S 纪元秒 # 纪元秒,方便用来实现
十毛
2019/03/27
8740
Python 代码片段总结
生成的pyc可以跨平台使用,但是只能这样用python xxx.pyc,而不能使用./xxx.pyc执行,因为缺少了shebang的支持,不过貌似Binfmt_misc可以解决这个问题,ubuntu下apt-get install binfmt-support可以直接安装。
老高的技术博客
2022/12/28
6290
Python 代码片段总结
golang代码片段(摘抄)
用户1141560
2017/12/22
7710
golang代码片段(摘抄)
PAT 1049. 数列的片段和(20)
首先我们看例子: 4 0.1 0.2 0.3 0.4  最后一个出现4次 倒数第二个出现6次 第二个出现6次  第一个出现4次  总结规律: 第n个数出现的次数: n * (总数 - n + 1)   
指点
2019/01/18
4830

相似问题

在RubyonRails中重写setter方法的正确方法是什么?

2251

不附着于活性的片段怎么弄?

10805

从GoogleChrome控制台命令行运行代码片段,使用(实验性)代码片段功能?

2325

检查类型是否为空的正确方法是什么?

2428

如何使用片段中的XML onClick处理按钮点击?

0243
相关问答用户
腾讯 | 技术专家擅长2个领域
高级数据分析师擅长5个领域
擅长4个领域
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档