Days 17 Fragment

1、碎片,可以在一个Activity中同时出现多个Fragment,并且,一个Fragment亦可在多个Activity中使用
2、Fragment中为空会报错
3、Fragment必须有name属性,其值为Fragment子类的全路径{初始化 activity视图是会调用Fragment组件的name属性对应的Fragment 类中的onCreateView()方法加载对应视图}
4、 必须要有id/tag属性
Days17Fragment01Work
备注:四个方法
1、getResources()返回该应用程序所对应的Resource类对象,无论从哪个Activity中调用都会返回同一个Resource对象
2、getConfiguration() 返回Configuration,Resource的方法,里面包含了很多配置信息,比如屏幕的分辨率、方向、尺寸
3、通过Activity的getFragmentManager()方法获得FragmentManager对象
4、通过FragmentManager对象的findFragmentById()方法获取该布局中的Fragment对象
功能:如果是横屏,则左侧有一个Fragment里设置一个ListView,点击右侧条目后,会左侧的Fragment会显示点击位置的条目所对应的内容;如果是竖屏,则初始界面只有一个Fragment里有一个ListView,点击条目后,会跳转到下一界面,下一界面中的Fragment会显示点击位置的条目所对应的内容
步骤:先在MainActivity中判断是横屏还是竖屏?
初始化Activity视图,
判断为横屏,(注意:只有横屏中有ContentFragment即展示内容的Fragment),然后设置左侧的Fragment即LeftFragment,和右侧的Fragment即ContentFragment,
判断为竖屏,只有一个Fragment即LeftFragment
需要继承Fragment;点击左侧ListView中条目后,回调条目的位置给MainActivity,(MainActivity需要实现回调接口),MainActivity通过ContentFragment是否为空判断横竖屏,
为横屏则直接设置对应条目内容给ContentFragment中的TextView,为竖屏则设置Intent传递position并跳转到ContentActivity中,获取ContentFragment和数据,并根据获得position设置对应条目内容
left.xml中为ListView布局文件
activity_main.xml横屏布局文件

 <fragment
        android:id="@+id/ftLeft"
        android:name="com.phone1000.days17fragment01work.LeftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:text="@string/hello_world" />

    <fragment
        android:id="@+id/ftRight"
        android:name="com.phone1000.days17fragment01work.ContentFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2"
        android:text="@string/hello_world" />

activity_main_port.xml竖屏初始界面布局文件

 <fragment
        android:id="@+id/ftLeft"
        android:name="com.phone1000.days17fragment01work.LeftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:text="@string/hello_world" />

**activity_content.xml**ContentActivity的布局文件

 <fragment
        android:id="@+id/ftContent"
        android:name="com.phone1000.days17fragment01work.ContentFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
public class MainActivity extends Activity implements
        IOnGetListViewItemListener {

    private ContentFragment contentFragment = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        /**
         * getResources()返回该应用程序所对应的Resource类对象,无论从哪个Activity中调用,
         * 都会返回同一个Resource对象 Configuration,里面包含了很多配置信息,比如屏幕的分辨率、方向、尺寸
         * 
         * Configuration.ORIENTATION_LANDSCAPE 的值为2,表示是横屏
         * Configuration.ORIENTATION_PORTRAIT 的值为1,表示是竖屏
         */
        // 如果是横屏
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
            // 横屏布局包含了两个Fragment(LeftFragment,ContentFragment)的布局
            /**
             * 会初始化MainActivity的视图
             * 会分别调用Fragment组件的name属性对应的Fragment类中的onCreateView()方法加载对应视图
             * 如:(com.phone1000.days17fragment01work.LeftFragment)
             * (com.phone1000.days17fragment01work.ContentFragment)
             */
            setContentView(R.layout.activity_main);

            /**
             * getFragmentManager()是Activity的方法,返回值为FragmentManager
             * findFragmentById()是FragmentManager的方法,返回值为Fragment
             */
            // 只有横屏布局中才有contentFragment,
            // 通过Activity的getFragmentManager()方法获得FragmentManager对象
            // 再通过FragmentManager对象的findFragmentById()方法获取该布局中的ContentFragment对象
            contentFragment = (ContentFragment) getFragmentManager()
                    .findFragmentById(R.id.ftRight);
        } else {
            // 如果是竖屏,仅包含了一个Fragment对象(LeftFragment)
            setContentView(R.layout.activity_main_port);
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    /**
     * 接收LeftFragment中回传的数据position
     */
    @Override
    public void onGetListViewItem(int position) {
        //contentFragment!=null,则为横屏,
        if (contentFragment != null) {
            // 直接设置contentFragment中对应position的内容
            contentFragment.setContent("i am " + position + "item");
        } else {
            //contentFragment == null ,则为竖屏
            //开启新的Activity接收要显示的数据
            Intent intent = new Intent(this, ContentActivity.class);

            //传递position给要显示条目内容Activity
            intent.putExtra("position", position);

            //开启新的Activity
            startActivity(intent);
        }
    }
}
public class LeftFragment extends Fragment {

    /**
     * Fragment的获取视图的方法,该方法的返回值作为当前Fragment的视图内容
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // 将left.xml(包含了一个ListView的相对布局)作为当前Fragment的内容展示
        View v = inflater.inflate(R.layout.left, container, false);

        ListView lvShow = (ListView) v.findViewById(R.id.lvShow);

        // 给当前v中的ListView构建适配器
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_dropdown_item_1line, new String[] {
                        "item0", "item1", "item2", "item3" });

        lvShow.setAdapter(adapter);

        // 给ListView设置条目点击监听
        lvShow.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // 在Fragment中,可以通过getActivity()方法获取**“宿主”**Activity
                Activity activity = getActivity();

                // 判断“宿主”Activity是否是一个IOnGetListViewItemListener回调接口
                // 由于MainActivity是宿主Activity,并且实现了IOnGetListViewItemListener接口
                // 可将其强转为IOnGetListViewItemListener接口
                if (activity instanceof IOnGetListViewItemListener) {
                    IOnGetListViewItemListener listener = (IOnGetListViewItemListener) activity;

                    // 通过IOnGetListViewItemListener接口对象的回调方法,将position回传给MainActivity
                    listener.onGetListViewItem(position);
                }
            }
        });

        return v;
    }
}
public class ContentFragment extends Fragment {

    private TextView txt = null;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
//       new TextView(Context)要传入一个Context对象
        txt = new TextView(getActivity());

        txt.setText("i am contentFragment");

        return txt;
    }

    public void setContent(String content) {
        txt.setText(content);
    }
}
public class ContentActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //android:name="com.phone1000.days17fragment01work.ContentFragment"
        //设置(只包含了ContentFragment内容的布局)为当前Activity的内容的布局
        setContentView(R.layout.activity_content);

        //获得FragmentManager对象
        FragmentManager manager = getFragmentManager();

        //通过manager的findFragmentById()方法获取ContentFragment对象
        ContentFragment contentFragment = (ContentFragment) manager
                .findFragmentById(R.id.ftContent);

        Intent intent = getIntent();

        int position = intent.getIntExtra("position", 0);

        String content = "展示"+position+"条目内容";

        //给contentFragment对象设置对应position条目的内容
        contentFragment.setContent(content);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.content, menu);
        return true;
    }

}
插入es返回{"ingestTookInMillis":-1,"took":{"micros":4000,"microsFrac":4000.0,"millisFrac":4.0,"secondsFrac":0.004,"minutesFrac":6.666666666666667E-5,"hoursFrac":1.111111111111111E-6,"daysFrac":4.6296296296296295E-8,"seconds":0,"days":0,"hours":0,"minutes":0,"millis":4,"stringRep":"4ms","nanos":4000000},"ingestTook":{"micros":-1000,"microsFrac":-1000.0,"millisFrac":-1.0,"secondsFrac":-0.001,"minutesFrac":-1.6666666666666667E-5,"hoursFrac":-2.7777777777777776E-7,"daysFrac":-1.1574074074074074E-8,"seconds":0,"days":0,"hours":0,"minutes":0,"millis":-1,"stringRep":"-1","nanos":-1000000},"items":[{"id":"JRiizn0Le26+T0v9FBUb17xjW66l/jyyD/d8MOzhPzU=","opType":"INDEX","response":{"shardInfo":{"total":2,"successful":2,"failures":[],"failed":0,"fragment":false},"shardId":{"index":{"name":"loglist_alias","uuid":"_na_","fragment":false},"indexName":"loglist_alias","id":-1,"fragment":true},"id":"JRiizn0Le26+T0v9FBUb17xjW66l/jyyD/d8MOzhPzU=","type":"_doc","version":1,"seqNo":528503,"primaryTerm":1,"result":"CREATED","index":"loglist_alias","fragment":false},"failure":null,"failureMessage":null,"failed":false,"itemId":0,"type":"_doc","index":"loglist_alias","version":1,"fragment":false},{"id":"/jZvsNSNKszBmf6V8yBzDL0e0lG+BtjimAMqjmjS66Q=","opType":"INDEX","response":{"shardInfo":{"total":2,"successful":2,"failures":[],"failed":0,"fragment":false},"shardId":{"index":{"name":"loglist_alias","uuid":"_na_","fragment":false},"indexName":"loglist_alias","id":-1,"fragment":true},"id":"/jZvsNSNKszBmf6V8yBzDL0e0lG+BtjimAMqjmjS66Q=","type":"_doc","version":1,"seqNo":528504,"primaryTerm":1,"result":"CREATED","index":"loglist_alias","fragment":false},"failure":null,"failureMessage":null,"failed":false,"itemId":1,"type":"_doc","index":"loglist_alias","version":1,"fragment":false}],"fragment":false}这是什么意思
10-15
#include <iostream> #include <vector> #include <algorithm> #include <climits> #include <cctype> #include <cstdlib> #include <ctime> // #include "enter.h" // #include "guanka3.h" using namespace std; struct Fragment { int l, w; }; // 暂停函数:等待用户按回车键继续 void press_enter_to_continue3() { cout << "\n按回车键继续..."; cin.get(); // 吃掉之前的换行 while (cin.get() != '\n'); // 再次等待用户按回车 } // 计算某条路径所需的总天数(启动次数) int calculateDays(const vector<Fragment>& fragments, const vector<int>& order) { if (order.empty()) return 0; int days = 1; // 第一次启动 for (size_t i = 1; i < order.size(); ++i) { int prev_idx = order[i - 1]; int curr_idx = order[i]; if (fragments[curr_idx].l < fragments[prev_idx].l || fragments[curr_idx].w < fragments[prev_idx].w) { days++; } } return days; } // 求出理论最小天数(通过枚举所有排列) int findOptimalDays(vector<Fragment>& fragments) { int n = fragments.size(); vector<int> perm; for (int i = 0; i < n; ++i) perm.push_back(i); int best = INT_MAX; do { int days = calculateDays(fragments, perm); if (days < best) best = days; } while (next_permutation(perm.begin(), perm.end())); return best; } // 舍伍德算法生成唯一的碎片尺寸 vector<Fragment> sherwoodFragments(int n) { vector<Fragment> fragments; vector<pair<int, int>> used; // 用于记录已生成的(l,w)对 // 初始化随机数生成器 srand(static_cast<unsigned int>(time(nullptr))); while (fragments.size() < n) { // 生成随机长度和重量(范围可根据需要调整) int l = rand() % 10 + 1; // 1-10之间的随机长度 int w = rand() % 10 + 1; // 1-10之间的随机重量 // 检查是否已存在相同的(l,w)对 pair<int, int> current = {l, w}; if (find(used.begin(), used.end(), current) == used.end()) { fragments.push_back({l, w}); used.push_back(current); } } return fragments; } bool playguanka3() { // 使用舍伍德算法生成4个具有唯一长度和重量的碎片 int n = 4; vector<Fragment> fragments = sherwoodFragments(n); // === 开始游戏 === cout << "第三关:合成魔法杖" << endl; cout << "欢迎来到魔法炉" << endl; cout << "你的任务是将这些【魔法碎片】合成为一根魔杖" << endl; press_enter_to_continue3(); // 询问是否查看规则 char choice; cout << "是否查看游戏规则?(yes/no): "; cin >> choice; choice = tolower(choice); if (choice == 'y' || choice == 'yes') { // 兼容y和yes输入 cout << "\n 游戏规则如下:" << endl; cout << "1. 第一次点燃魔法炉需要 1 天准备时间。" << endl; cout << "2. 下一块碎片如果「长度和重量都不小于」前一块," << endl; cout << " 就可以直接继续打磨!无需重启。" << endl; cout << "3. 否则,必须再花 1 天重新预热!" << endl; cout << "4. 目标:用最少的天数完成合成!" << endl; } press_enter_to_continue3(); // 显示当前碎片信息 cout << "当前有 " << n << " 块碎片" << endl; cout << "它们的重量和长度是:" << endl; for (int i = 0; i < n; ++i) { cout << " 碎片" << (i + 1) << ":长度=" << fragments[i].l << ", 重量=" << fragments[i].w << endl; } press_enter_to_continue3(); cout << "请选择碎片的合成顺序:" << endl; cout << "请输入 " << n << " 个数字(1~" << n << "),用空格分隔,表示使用顺序:" << endl; cout << " 准备好了吗?按下回车键开始输入... "; press_enter_to_continue3(); // 玩家输入顺序 vector<int> player_order(n); for (int i = 0; i < n; ++i) { cin >> player_order[i]; player_order[i]--; // 转换为索引(从0开始) } // 验证输入是否合法(包含 0~n-1 的每个数一次) vector<bool> used(n, false); bool valid = true; for (int idx : player_order) { if (idx < 0 || idx >= n || used[idx]) { valid = false; break; } used[idx] = true; } if (!valid) { cout << " 输入无效!必须是 1 到 " << n << " 的不重复数字。" << endl; cout << "合成失败" << endl; return false; } // 计算玩家所用天数 int player_days = calculateDays(fragments, player_order); // 计算理论最优天数 int optimal_days = findOptimalDays(fragments); // === 输出结果 === if (player_days == optimal_days) { cout << " 合成成功!你以最短时间完成了魔杖!" << endl; return true; } else { cout << " 合成失败!这不是最快的方法,再试试看吧!" << endl; cout << " 小提示:把碎片从小到大排列,更容易连续打磨!"<< endl; return false; } press_enter_to_continue3(); } // 测试用主函数 列举实验中实现算法的主要函数,并对函数作简要说明
10-27
// level3.cpp #include <iostream> #include <vector> #include <algorithm> #include "common.h" // 添加包含 using namespace std; struct Fragment { int id, len, wt; }; bool play_level3() { vector<Fragment> frags = { {1, 8, 10}, {2, 5, 12}, {3, 4, 6}, {4, 6, 8}, {5, 3, 5} }; cout << "\n--- 第三关:合成魔杖\n"; cout << "--- 每块碎片需放入魔法炉打磨。\n"; cout << "--- 初始开启需 1 天准备时间。\n"; cout << "--- 若下一块碎片长度和重量均不小于上一块,则无需重新准备;\n"; cout << "--- 否则需再花 1 天准备时间。\n"; cout << "--- “我发现只有一个小碎片与众不同……也许它应该留在最后”\n"; cout << "--- 碎片属性如下:\n"; for (const auto& f : frags) { cout << " 碎片 " << f.id << ": L=" << f.len << ", W=" << f.wt << "\n"; } cout << "\n--- 请安排打磨顺序(输入碎片编号 1~5,共五个):\n"; // ✅ 舍伍德算法:随机尝试多个顺序,找最小准备天数 vector<int> order = { 0,1,2,3,4 }; // 索引数组 int min_days = 10; for (int t = 0; t < 150; ++t) { random_shuffle(order.begin(), order.end()); int days = 1; for (int i = 1; i < 5; ++i) { auto& prev = frags[order[i - 1]]; auto& curr = frags[order[i]]; if (!(curr.len >= prev.len && curr.wt >= prev.wt)) days++; } if (days < min_days) { min_days = days; } } cout << "--- (魔法水晶微微发亮:似乎有一条隐秘的最优之路...)\n"; for (int attempt = 1; attempt <= 2; ++attempt) { cout << "\n--- 第 " << attempt << " 次尝试\n"; cout << "请输入你的顺序(五个数字):"; vector<int> order(5); vector<Fragment> selected; bool valid_input = true; for (int i = 0; i < 5; ++i) { cin >> order[i]; if (order[i] >= 1 && order[i] <= 5) { selected.push_back(frags[order[i] - 1]); } else { cout << "--- 输入错误,请输入 1~5 的数字。\n"; valid_input = false; break; } } if (!valid_input) { if (attempt == 1) cout << "--- 再试一次吧。\n"; continue; } int days = 1; cout << "\n--- 开始合成...\n"; cout << " 第1块(" << selected[0].id << "): 魔法炉启动,耗时1天。\n"; bool success = true; for (int i = 1; i < 5; ++i) { if (selected[i].len >= selected[i - 1].len && selected[i].wt >= selected[i - 1].wt) { cout << " 第" << i + 1 << "块(" << selected[i].id << "): 可连续打磨,无需额外准备。\n"; } else { days++; cout << " 第" << i + 1 << "块(" << selected[i].id << "): 规格下降,需重新准备,新增1天。\n"; } } cout << "--- 总耗时:" << days << " 天。\n"; if (days == 2) { cout << "\n--- 完美!你以最短时间合成了魔杖!\n"; return true; } else { cout << "--- 时间较长,或许有更好的顺序。\n"; if (attempt == 1) cout << "--- 再试一次吧。\n"; } } cout << "\n--- 未能高效合成魔杖,任务失败。\n"; return false; } //答案53412在我这个代码上面改,不要乱改,不要写的太复杂
10-22
AI 代码审查Review工具 是一个旨在自动化代码审查流程的工具。它通过集成版本控制系统(如 GitHub 和 GitLab)的 Webhook,利用大型语言模型(LLM)对代码变更进行分析,并将审查意见反馈到相应的 Pull Request 或 Merge Request 中。此外,它还支持将审查结果通知到企业微信等通讯工具。 一个基于 LLM 的自动化代码审查助手。通过 GitHub/GitLab Webhook 监听 PR/MR 变更,调用 AI 分析代码,并将审查意见自动评论到 PR/MR,同时支持多种通知渠道。 主要功能 多平台支持: 集成 GitHub 和 GitLab Webhook,监听 Pull Request / Merge Request 事件。 智能审查模式: 详细审查 (/github_webhook, /gitlab_webhook): AI 对每个变更文件进行分析,旨在找出具体问题。审查意见会以结构化的形式(例如,定位到特定代码行、问题分类、严重程度、分析和建议)逐条评论到 PR/MR。AI 模型会输出 JSON 格式的分析结果,系统再将其转换为多条独立的评论。 通用审查 (/github_webhook_general, /gitlab_webhook_general): AI 对每个变更文件进行整体性分析,并为每个文件生成一个 Markdown 格式的总结性评论。 自动化流程: 自动将 AI 审查意见(详细模式下为多条,通用模式下为每个文件一条)发布到 PR/MR。 在所有文件审查完毕后,自动在 PR/MR 中发布一条总结性评论。 即便 AI 未发现任何值得报告的问题,也会发布相应的友好提示和总结评论。 异步处理审查任务,快速响应 Webhook。 通过 Redis 防止对同一 Commit 的重复审查。 灵活配置: 通过环境变量设置基
【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本文介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器的状态空间平均模型的建模策略。该方法通过数学建模手段对直流微电网系统进行精确的状态空间描述,并对其进行线性化处理,以便于系统稳定性分析与控制器设计。文中结合Matlab代码实现,展示了建模与仿真过程,有助于研究人员理解和复现相关技术,推动直流微电网系统的动态性能研究与工程应用。; 适合人群:具备电力电子、电力系统或自动化等相关背景,熟悉Matlab/Simulink仿真工具,从事新能源、微电网或智能电网研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网的动态建模方法;②学习DC-DC变换器在耦合条件下的状态空间平均建模技巧;③实现系统的线性化分析并支持后续控制器设计(如电压稳定控制、功率分配等);④为科研论文撰写、项目仿真验证提供技术支持与代码参考。; 阅读建议:建议读者结合Matlab代码逐步实践建模流程,重点关注状态变量选取、平均化处理和线性化推导过程,同时可扩展应用于更复杂的直流微电网拓扑结构中,提升系统分析与设计能力。
内容概要:本文介绍了基于物PINN驱动的三维声波波动方程求解(Matlab代码实现)理信息神经网络(PINN)求解三维声波波动方程的Matlab代码实现方法,展示了如何利用PINN技术在无需大量标注数据的情况下,结合物理定律约束进行偏微分方程的数值求解。该方法将神经网络与物理方程深度融合,适用于复杂波动问题的建模与仿真,并提供了完整的Matlab实现方案,便于科研人员理解和复现。此外,文档还列举了多个相关科研方向和技术服务内容,涵盖智能优化算法、机器学习、信号处理、电力系统等多个领域,突出其在科研仿真中的广泛应用价值。; 适合人群:具备一定数学建模基础和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适合从事计算物理、声学仿真、偏微分方程数值解等相关领域的研究人员; 使用场景及目标:①学习并掌握PINN在求解三维声波波动方程中的应用原理与实现方式;②拓展至其他物理系统的建模与仿真,如电磁场、热传导、流体力学等问题;③为科研项目提供可复用的代码框架和技术支持参考; 阅读建议:建议读者结合文中提供的网盘资源下载完整代码,按照目录顺序逐步学习,重点关注PINN网络结构设计、损失函数构建及物理边界条件的嵌入方法,同时可借鉴其他案例提升综合仿真能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值