在片段中运行时更改方向时更改布局,而无需重新创建视图

2023-11-25

我尝试开发第一个应用程序,从网络下载图像并在网格视图中显示它们。 gridview 是主 Activity 的一个片段。下载过程是通过 onCreate 函数中的 AsyncTask 完成的。为了在改变方向时不再次下载图像,我设置了android:configChanges="orientation|screenSize"在 Android 清单中。然后 onCreate 函数只调用一次,一切都很好......除了我必须在横向模式下对 gridview 片段的布局进行一些更改。所以我创建了 2 个布局表:fragment_library.xml and fragment_library_land.xml在布局/文件夹中。为了使这些更改生效,我尝试使用 onConfigurationChanged 函数手动更改库片段的布局。在运行时,程序评估函数并传递良好的情况(纵向或横向),但使用的布局仍然是纵向模式的布局:fragment_library.xml ...

public class LibraryFragment extends Fragment {
    public GridView gridview;
    private Boolean isImageAdapterPopulated = false;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        GetLibraryTask getLibraryTask = new GetLibraryTask(this);
        getLibraryTask.execute(Config.URL + "action=getLibrary");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        if (container == null)
            return null;

        // gridview
        View V = inflater.inflate(R.layout.fragment_library, container, false);
        gridview = (GridView)V.findViewById(R.id.gridview);

        if(this.isImageAdapterPopulated)
            this.setGridAdapter();
        return V;
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig){
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService( Context.LAYOUT_INFLATER_SERVICE );
            inflater.inflate(R.layout.fragment_library_land, null);
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService( Context.LAYOUT_INFLATER_SERVICE );
            inflater.inflate(R.layout.fragment_library, null);
        }
    }

    public void setGridAdapter(){
        this.isImageAdapterPopulated = true;
        gridview.setAdapter(new ImageAdapter(getActivity()));
    }

    // ...
}

片段库.xml

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/gridview"
    android:cacheColorHint="@android:color/transparent"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:columnWidth="200dp"
    android:numColumns="auto_fit"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="20dp"
    android:stretchMode="columnWidth"
    android:gravity="bottom"
/>

fragment_library_land.xml

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/gridview"
    android:cacheColorHint="@android:color/transparent"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:columnWidth="400dp"
    android:numColumns="2"
    android:verticalSpacing="50dp"
    android:horizontalSpacing="50dp"
    android:stretchMode="columnWidth"
    android:gravity="bottom"
/>

感谢帮助 :)


这不可能。 Fragment 无法动态更新其布局。不过,您确实还有其他一些选择。

1。不喜欢这个,但您可能有一个片段的布局,同时具有纵向和水平视图并显示和隐藏。

片段_库.xml:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/gridview_portrait"
    android:cacheColorHint="@android:color/transparent"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:columnWidth="200dp"
    android:numColumns="auto_fit"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="20dp"
    android:stretchMode="columnWidth"
    android:gravity="bottom"
/>
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/gridview_landscape"
    android:cacheColorHint="@android:color/transparent"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:columnWidth="400dp"
    android:numColumns="2"
    android:verticalSpacing="50dp"
    android:horizontalSpacing="50dp"
    android:stretchMode="columnWidth"
    android:gravity="bottom"
    android:visible="gone"
/>

然后是一些私有成员变量:

private GridView mGridViewPortrait;
private GridView mGridViewLandscape;

Then in onConfigurationChanged(Configuration newConfig):

@Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);

            if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
                 mGridViewPortrait.setVisibility(View.VISIBLE);
                 mGridViewLandscape.setVisibility(View.GONE);
            }

            else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
                 mGridViewPortrait.setVisibility(View.GONE);
                 mGridViewLandscape.setVisibility(View.VISIBLE);
            }
        }

几点:请注意,我省略了引用两个 GridView 的代码。我还将您的 GridView 更改为私有,并将名称更改为 mGridView*。私有以保持其“数据封装”和“m”,因为它是类的成员,只是约定。我还更改了 if-else 子句,因为我希望首先进行肖像检查。

这种方式是最快和最简单的,但是如果您有很大的布局,它可能会变得对系统来说很重,所以这样做not如果你有很多东西,请使用这个。最好根本不要使用这种方法。

2。正确的方法是让 Android 处理方向并将 XML 移动到正确的目录。然而,这将重新创建您的片段(如果您不设置setRetainInstance(true);在这种情况下你不会;这将使片段不会重新创建它的布局(实际上是查找保留方法它没有提到onCreateView所以你也可以尝试将其设置为 true 并尝试))。

将fragment_library_land.xml移动到目录layout-land而不是layout并将其命名片段库.xml。请注意粗体,它将具有相同的名称,但位于不同的目录中。这样 Android 就会知道并根据方向采取正确的布局。

如果我明白为什么你不想重新创建片段,因为onCreate(Bundle savedInstanceState)将再次被调用(与setRetainInstance(true);它不会,并且关于我之前写的内容,你可以尝试一下),从而创建一个新实例GetLibraryTask并再次下载图像。如果您使用数据库来存储图像并且您有一个布尔值来跟踪您是否已下载图像,则可以防止这种情况。在GetLibraryTask然后,您将挑选出未下载的图像,无论是第一次运行任务还是方向发生变化。您还需要在下载循环中的库任务中进行停止检查,在每个项目之前检查您是否应该下载图像或片段是否不再可用,从而退出任务。

现在,当您更改方向时,活动将重新创建库片段,并根据方向使用布局或布局区域。

代码中的一些附注:

  • 正如我之前所写,永远不要使用公共访问,在必要时始终使用私有或受保护的访问。 Private 可以一直使用,并且有 getter 和 setter(访问器和修改器)来进行通信。
  • 在本例中使用“m”作为成员变量的前缀public GridView gridview将会private GridView mGridView and private Boolean isImageAdapterPopulated将会private boolean mIsImageAdapterPopulated
  • 如果不需要,切勿将类用于原始类型。您可能在不支持原始类型或类保留等的列表中需要它。
  • In your onConfigurationChanged(Configuration newConfig)你膨胀了一个 XML,它返回一个视图,但你没有用它做任何事情

祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在片段中运行时更改方向时更改布局,而无需重新创建视图 的相关文章

  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • TypedArray 的 getResourceId 方法

    我正在阅读有关的文档获取资源Id https developer android com reference android content res TypedArray html getResourceId int 20int 方法 它说
  • 与其他图标相比,AppCompat ShareActionProvider 图标太大

    我将 ActionBarSherlock 更改为 AppCompat v7 我已经完成了使其工作所需的所有更改 但是共享图标 使用 ShareActionProvider 发生了一些奇怪的情况 与其他图标相比 共享图标太大 我还使用支持库进
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • 如何获取.so文件的依赖项列表?

    假设我有libFoo so为 android arm 编译 我不确定它链接到什么STL实现 有options http developer android com intl ru ndk guides standalone toolchai
  • FileNotFoundException:/存储/模拟/0/Android

    我尝试这个文件写入器 读取器代码段进行测试 File file new File Environment getExternalStorageDirectory LM lm lisdat 01 txt FileOutputStream ou
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • Android 应用被 Google Play 拒绝

    我最近向 Google Play 商店提交了一个 Android 应用程序 但收到一条消息说我的应用程序已被拒绝 我不确定问题是什么 也找不到确切的解决方案 拒绝原因 违反了禁止行为条款 内容政策 经过定期审核后 我们确定您的应用程序支持
  • 如何以编程方式断开拨出呼叫

    我使用以下代码以编程方式断开呼叫 但它不起作用 private void callDisconnect try TelephonyManager manager TelephonyManager this getSystemService
  • Android:应用内计费V3超时返回哪个响应码?

    出现网络超时情况时 Google Play 应用内结算服务 ice er V3 将返回哪些响应状态代码 它的所有功能都是统一的吗 我将在这里描述我的发现 我通过拔掉主机插头 在安装了全功能 GP GP Store V3 10 10 GP S
  • 如何强制从本机代码打开 Android 软键盘?

    我有一个游戏 当用户触摸屏幕时 它使用从 C 到 Java 的回调来强制打开软键盘 Java代码很简单是这样的 this inputMethodManager toggleSoftInput InputMethodManager SHOW
  • 如何防止布局的方向改变,而不是整个屏幕/活动的方向改变

    我需要一个子布局 可以是任何布局 例如FrameLayout or RelativeLayout 忽略方向变化并始终保持横向 但不是它的父级或任何其他兄弟布局 视图 它们应该相应地改变它们的方向 因此 我不能使用setRequestedOr
  • 如何持续更新MPAndroidChart中的Y轴值

    我希望 LineChart 中的轴能够实时调整其最大值和最小值 当新数据的 Y 值增加 正值和负值 时 像 ResetAxisMaxValue 和 ResetAxisMinValue 这样的函数可以很好地工作 但是 一旦信号再次变低 Y 值
  • 从 TextView 中显示的数字中删除小数点[重复]

    这个问题在这里已经有答案了 对于我的简单计算器 我将结果显示在TextView 但它总是显示小数 我怎样才能删除它们 这是我的代码 public class MainActivity extends Activity implements
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • onBackPressed 隐藏 不破坏 Activity

    我知道如何取消后退按键 以便活动 主窗口保持可见 public void onBackPressed return 我的目标是隐藏该活动 但是 在没有完成它的情况下 您如何在 onBackPressed 事件中做到这一点 即我想达到 onP
  • android httprequest java.net.UnknownHostException

    我想用android发出http请求 是使用这个 void testHTTP HttpClient httpClient new DefaultHttpClient HttpUriRequest request new HttpPost h
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • Android:如何检测手机设置中的语言已更改

    我如何检测我的手机语言是否已更改 例如 Facebook 应用程序将向我们宣布 please wait we preparing your language i used myString Locale getDefault getDisp

随机推荐

  • 如何在 git checkout 上仅恢复修改过的文件?

    假设我有一个包含数百个文件的目录 我修改了其中一些 但后来我意识到我的修改很糟糕 如果我做 git checkout whole folder 然后所有的东西都会被再次检查 我必须重新编译所有的东西 有没有办法让结账只影响修改过的文件 或者
  • LazyLoadingEnabled 设置似乎在 EF 5 中不起作用

    我首先将 EF 模型与 POCO 实体和自定义 DbContext 一起使用 我的问题是设置LazyLoadingEnabled false不会影响任何内容 导航属性仍会加载 下面是我的简化示例 实体计划 一个程序可以是其他程序的一部分 n
  • 如何在 Postgres 中搜索字符串中是否存在整个单词

    我有一张带有一列的桌子field具有像三星手机这样的价值 我的问题是 如果我搜索字符串 Samsung 或 phone 如何获得这一行 如果我只给出 Sam 或 ph 作为搜索词 我不想要任何结果 我曾尝试使用 ILIKE 运算符 但如果我
  • 在 VB.NET 中订阅事件

    我正在尝试将一些 C 代码转换为 VB NET 我在 C 中有以下内容 有效 m switchImageTimer new DispatcherTimer m switchImageTimer Interval Interval m swi
  • Java:将大量数据序列化到单个文件

    我需要将小对象的大量数据 大约 2gig 序列化到单个文件中 以便稍后由另一个 Java 进程处理 性能很重要 谁能建议一个好的方法来实现这一目标 你有没有看过谷歌的协议缓冲区 听起来像是它的一个用例
  • AMD多核编程

    我想开始编写应用程序 C 它将利用额外的核心来执行需要执行大量计算并且其计算彼此独立的代码部分 我有以下处理器 x64 Family 15 Model 104 Stepping 2 Authentic AMD 1900 Mhz 在 Wind
  • JavaScript 中的睡眠 - 操作之间的延迟

    有没有办法可以在 JavaScript 执行另一个操作之前让其休眠 Example var a 1 3 Sleep 3 seconds before the next action here var b a 4 您可以使用setTimeou
  • 如何在 xunit/autofixture 中组合 PropertyData 和 AutoNSubstituteData 属性?

    我正在使用 AutoNSubstituteData 属性 发布在这里 AutoFixture xUnit net 和自动模拟 我想将其与 PropertyData 来自 xunit 扩展的属性 这是我的测试 public static IE
  • 在 Android Studio Java 中读取文本文件

    我有一个类 QuoteBank 需要使用扫描仪读取 txt 文件 但它给了我一个文件未找到异常 java 文件位于 应用程序 src main java nate marxBros QuoteBank java txt 文件位于 应用程序
  • Django celery Worker 将实时状态和结果消息发送到前端

    在 django 应用程序中 我正在运行异步任务 并希望向用户显示进度 错误等 如果出现错误 则应将用户重定向到需要额外输入或执行某些操作才能解决问题的页面 从 celery 工作返回到前端的最佳通信方式是什么 这是伪代码的基本结构 vie
  • 如何将 C# 方法添加到现有的大型 wix 脚本中

    我们现有的 wix 脚本相当复杂且冗长 所有自定义操作均使用内联 vbscript 执行 我想将其中一些操作从 vbscript 切换到 C 各地的所有示例都以 在 VisualStudio 中创建一个 wix 项目 开头 有没有关于如何将
  • 构建并安装 x86_64 而不是 i386 的 Brew 应用程序?

    我完成此操作后 酿造安装git 我这样做 哪个git 返回 usr local bin git 然后我这样做 文件 usr local bin git 返回 usr local bin git Mach O 可执行文件 i386 我需要br
  • 数字和一位小数的正则表达式

    我似乎无法使用简单的正则表达式来工作 这是我目前所拥有的 Hours on input function e var regex d d 0 2 g if regex test this value if regex test this v
  • 获取变量名。 javascript“反射”

    有没有办法获取变量name 就像你可以在 Net 中使用反射做的那样 就像在这个场景中 function x y z if x 0 logger log variable x reflectedName has invalid value
  • 在应用程序域之间来回传递值

    我有以下代码 public class AppDomainArgs MarshalByRefObject public string myString static AppDomainArgs ada new AppDomainArgs m
  • 有关即将推出的 fork-join 框架的资源

    我正在寻找有关如何使用即将推出的 jsr166y fork join fences 和 extras166y ParallelArray 等 的组织良好的信息源 从教程到专家级别的内容 IBM Developerworks 网站有一个好系列
  • 如何写一个解释器?

    我决定用 Ruby 编写一个小型解释器作为我的下一个项目 我需要什么知识 技能才能成功 我还没有决定要解释的语言 但我正在寻找一种不是玩具语言 但相对容易编写解释器的语言 提前致谢 你至少必须学习 词法分析 将字符分组为标记 解析 将标记分
  • Bootstrap 缩略图中的垂直居中约束图像

    Using 推特引导程序 我正在尝试创建一个水平滚动的系列缩略图它允许在显示缩略图的行中使用滚动条 如下所示 使用以下 HTML 我可以完成大部分工作 div class row Hello there div div class row
  • fgets 实现 (K&R)

    我是编程新手 从 Objective C 开始 但决定在进一步发展之前先回到基础知识 我花了一些时间在 C 上 并且正在努力克服指针混乱 我的问题是关于 K R 所说的 fgets 是如何实现的 第 165 页 第二版 下面的代码直接来自文
  • 在片段中运行时更改方向时更改布局,而无需重新创建视图

    我尝试开发第一个应用程序 从网络下载图像并在网格视图中显示它们 gridview 是主 Activity 的一个片段 下载过程是通过 onCreate 函数中的 AsyncTask 完成的 为了在改变方向时不再次下载图像 我设置了andro