android – 在片段中更改布局,同时在片段中更改方向,而不重新创建视图

android – 在片段中更改布局,同时在片段中更改方向,而不重新创建视图,第1张

概述我尝试开发第一个从网上下载图像并在gridview中显示它们的应用程序. gridview是主Activity的片段.下载过程是使用onCreate函数中的AsyncTask完成的.为了在改变方向时不再下载图像,我在 Android Manifest中设置了android:configChanges =“orientation | screenSize”.然后onCreate函数只调用一次,一切都 我尝试开发第一个从网上下载图像并在grIDvIEw中显示它们的应用程序. grIDvIEw是主Activity的片段.下载过程是使用onCreate函数中的AsyncTask完成的.为了在改变方向时不再下载图像,我在 Android Manifest中设置了androID:configChanges =“orIEntation | screenSize”.然后onCreate函数只调用一次,一切都很好……除了我必须在横向模式下对grIDvIEw片段的布局进行一些更改.所以我在layout /文件夹中创建了2个布局表:fragment_library.xml和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()));    }    // ...}

fragment_library.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"/>

感谢帮助 :)

解决方法 这不可能.片段无法动态更新其布局.但是你确实有其他选择.

1.不是这个的粉丝,但你可能同时拥有Fragment的布局同时包含肖像和水平视图并显示和隐藏.

fragment_library.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;

然后在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);            }        }

一些要点:请注意,我省略了引用两个GrIDVIEws的代码.我还将您的GrIDVIEw更改为私有,并将名称更改为mGrIDVIEw *.私有以保持“数据封装”和“m”,因为它是类的成员,只是约定.我也改变了if-else子句,因为我想先将肖像检查放在首位.

这种方式是最快和最简单的,但是如果你有大的布局,它可能会变得很重,所以如果你有很多东西就不要使用它.最好不要使用这种方法.

2.正确的方法是让AndorID处理方向,并将XML移动到正确的目录.然而,这将重新创建你的Fragment(如果你没有设置setRetainInstance(true);在这种情况下你不会;这将使Fragment不重新创建它的布局(实际上查找the retain method它没有提到onCreateVIEw所以你可能会尝试设置这也是真实的,并尝试)).

将fragment_library_land.xml移动到目录layout-land而不是layout,并将其命名为fragment_library.xml.注意粗体,它将具有相同的名称,但保留在不同的目录中.这样AndroID就会知道并根据方向采取正确的布局.

如果我已经理解为什么你不想重新创建片段,因为onCreate(Bundle savedInstanceState)将再次被调用(使用setRetainInstance(true);它不会和我之前写的那样你可以尝试一下)因此创建GetlibraryTask的新实例并再次下载图像.如果您使用数据库存储图像,并且如果您有一个布尔值,如果您已下载图像,则可以防止这种情况.在GetlibraryTask中,您将选择未下载的图像,无论是第一次运行任务还是更改方向.您还需要在下载循环中对库任务进行停止检查,在每个项目检查之前是否应该下载图像,或者片段是否不再可用,从而退出任务.

现在,当您更改方向时,Activity将重新创建libraryFragment,并根据方向使用layout或layout-land.

您的代码中的一些附注:

>正如我之前所写,永远不要使用公共访问,在必要时始终使用私有或受保护. Private可以一直使用,并有getter和setter(加法器和mutators)来进行通信.
>使用“m”作为成员变量的前缀,在这种情况下,公共GrIDVIEw grIDvIEw将是私有GrIDVIEw mGrIDVIEw和private布尔isImageAdapterPopulated将是私有boolean mIsImageAdapterPopulated
>如果您不需要,请不要使用基类类.您可能需要在不支持基本类型或类保留等的列表中.
>在你的onConfigurationChanged(配置newConfig)中,你膨胀一个XML,然后它返回一个VIEw,但是你没有对它做任何事情

祝你好运!

总结

以上是内存溢出为你收集整理的android – 在片段中更改布局,同时在片段中更改方向,而不重新创建视图全部内容,希望文章能够帮你解决android – 在片段中更改布局,同时在片段中更改方向,而不重新创建视图所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1137599.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存