此处将为大家介绍关于android–保存片段的状态?的详细内容,并且为您解答有关android保存数据的相关问题,此外,我们还将为您介绍关于android–Fragment中的ViewPager不会恢
此处将为大家介绍关于android – 保存片段的状态?的详细内容,并且为您解答有关android 保存数据的相关问题,此外,我们还将为您介绍关于android – Fragment中的ViewPager不会恢复子片段的状态、android – ViewPager里面的片段,怎么保留状态?、android – 单击ListView项目更改项目内元素的状态?、android – 在tabs开关中保存片段状态的有用信息。
本文目录一览:- android – 保存片段的状态?(android 保存数据)
- android – Fragment中的ViewPager不会恢复子片段的状态
- android – ViewPager里面的片段,怎么保留状态?
- android – 单击ListView项目更改项目内元素的状态?
- android – 在tabs开关中保存片段状态
android – 保存片段的状态?(android 保存数据)
public class FragmentA extends Fragment { Button button; WebView myWebView; int mCurCheckPosition; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("curChoice",mCurCheckPosition); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (savedInstanceState != null) { // Restore last state for checked position. mCurCheckPosition = savedInstanceState.getInt("curChoice",0); } } @Override public View onCreateView(LayoutInflater inflater,ViewGroup group,Bundle saved) { View mainView = (View) inflater.inflate(R.layout.frag_a,group,false); myWebView = (WebView) mainView.findViewById(R.id.webview); myWebView.setWebViewClient(new MyWebViewClient()); myWebView.getSettings().setPluginsEnabled(true); myWebView.getSettings().setBuiltInZoomControls(false); myWebView.getSettings().setSupportZoom(false); myWebView.getSettings().setJavaScriptCanopenWindowsAutomatically(true); myWebView.getSettings().setAllowFileAccess(true); myWebView.getSettings().setDomStorageEnabled(true); myWebView.loadUrl("http://www.bbc.co.uk"); return mainView; } public class MyWebViewClient extends WebViewClient { /* (non-Java doc) * @see android.webkit.WebViewClient#shouldOverrideUrlLoading(android.webkit.WebView,java.lang.String) */ @Override public boolean shouldOverrideUrlLoading(WebView view,String url) { if (url.endsWith(".mp4")) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse(url),"video/*"); view.getContext().startActivity(intent); return true; } else { return super.shouldOverrideUrlLoading(view,url); } } }
}
问题是当我移动到另一个片段时,原始片段(它所在的网页)的状态将丢失.
我怎么能阻止这个?我希望网页的状态保持切换到每个片段和从每个片段切换.
谢谢
解决方法
@Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mWebView.saveState(outState); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mWebView.restoreState(savedInstanceState); }
还要记住片段生命周期.如果您不确定在哪里恢复状态(onCreate,onCreateView,onActivityCreated),请查看Fragment Lifecycle文档以找出正确的位置.
http://developer.android.com/guide/components/fragments.html
onCreate()
系统在创建片段时调用此方法.在您的实现中,您应该在片段暂停或停止时初始化要保留的片段的基本组件,然后重新开始.
onCreateView()
当片段第一次绘制其用户界面时,系统会调用此方法.要为片段绘制UI,必须从此方法返回视图,该视图是片段布局的根.如果片段不提供UI,则可以返回null.
onActivityCreated()
在创建片段的活动并且实例化此片段的视图层次结构时调用.一旦这些部分就位,它可用于进行最终初始化,例如检索视图或恢复状态.对于使用setRetainInstance(boolean)保留其实例的片段也很有用,因为此回调告诉片段何时与新活动实例完全关联.这是在onCreateView(LayoutInflater,ViewGroup,Bundle)之后和onStart()之前调用的.
android – Fragment中的ViewPager不会恢复子片段的状态
问题是我无法在viewpager的回收器视图中的屏幕旋转后恢复滚动位置.我认为问题出现在recyclerview中,但很快我发现在viewpager中的屏幕旋转片段正在重新创建之后,所以onCreate()和onDestroy()被调用,即使它们不应该.我也试过使用onSaveInstanceState(bundle),发现在onCreateView()里面这个bundle总是为null.所以我该怎么做?
This主题没有帮助我.
解决方法
android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragment = new PagerFragment(); fragmentTransaction.replace(R.id.fragment_container,fragment); fragmentTransaction.commit();
但我应该这样做:
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container); if (fragment == null) { android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragment = new PagerFragment(); fragmentTransaction.replace(R.id.fragment_container,fragment); fragmentTransaction.commit(); }
这完全是我的错,我很惭愧.对不起.
android – ViewPager里面的片段,怎么保留状态?
在我的活动中,为了防止在配置更改中重新生成片段:
if(getSupportFragmentManager().findFragmentByTag(MAIN_TAB_FRAGMENT) == null) { getSupportFragmentManager().beginTransaction().replace(R.id.container,new MainTabFragment(),MAIN_TAB_FRAGMENT).commit(); }
片段代码B:
public class MainTabFragment extends Fragment { private PagerSlidingTabStrip mSlidingTabLayout; private LfPagerAdapter adapter; private ViewPager mViewPager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } @Nullable @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_tab,container,false); } @Override public void onViewCreated(View view,Bundle savedInstanceState) { this.adapter = new LfPagerAdapter(getChildFragmentManager()); this.mViewPager = (ViewPager) view.findViewById(R.id.viewpager); this.mViewPager.setAdapter(adapter); this.mSlidingTabLayout = (PagerSlidingTabStrip) view.findViewById(R.id.sliding_tabs); this.mSlidingTabLayout.setViewPager(this.mViewPager); } }
适配器代码:
public class LfPagerAdapter extends FragmentPagerAdapter { private static final int NUM_ITEMS = 3; private FragmentManager fragmentManager; public LfPagerAdapter(FragmentManager fm) { super(fm); this.fragmentManager = fm; } @Override public int getCount() { return NUM_ITEMS; } @Override public Fragment getItem(int position) { Log.d("TEST","TEST"); switch (position) { case 1: return FragmentC.newInstance(); case 2: return FragmentD.newInstance(); default: return FragmentE.newInstance(); } } }
我的问题是,我无法保留视图寻呼机的状态,它的小孩片段的方向更改.
显然,这是每个轮回的要求:
this.adapter = new LfPagerAdapter(getChildFragmentManager());
这将导致整个寻呼机被重新创建,对吧?结果是
getItem(int position)
将会在每个轮播中被调用,片段将从头创建并丢失其状态:
return FragmentC.newInstance();
我试着解决这个问题:
if(this.adapter == null) this.adapter = new LfPagerAdapter(getChildFragmentManager());
在onViewCreated中,但是结果是旋转了被移除的寻呼机内的碎片.
任何想法如何正确保留传呼机内的状态?
解决方法
1)您应该使用onCreate方法代替onViewCreated来实例化LfPagerAdapter;
即:
public class MainTabFragment extends Fragment { private PagerSlidingTabStrip mSlidingTabLayout; private LfPagerAdapter adapter; private ViewPager mViewPager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); this.adapter = new LfPagerAdapter(getChildFragmentManager()); } @Nullable @Override public View onCreateView(LayoutInflater inflater,Bundle savedInstanceState) { this.mViewPager = (ViewPager) view.findViewById(R.id.viewpager); this.mViewPager.setAdapter(adapter); this.mSlidingTabLayout = (PagerSlidingTabStrip) view.findViewById(R.id.sliding_tabs); this.mSlidingTabLayout.setViewPager(this.mViewPager); } }
2)您将需要扩展FragmentStatePagerAdapter而不是FragmentPagerAdapter
android – 单击ListView项目更改项目内元素的状态?
我不知道如何解释这个问题,但我会试试.我有一个包含几个项目的ListView.每个项目都有一个TextView和两个ImageView.我想在单击它们时更改ImageView,并且当我长按ListView项目时,我想打开上下文菜单.
对于ImageView,一切正常.对于整个项目,我可以在长按后显示上下文菜单,但我的问题是,当我按下TextView时,ImageView也会改变.
索莫的代码片段:
ListView项目:
<TextView
android:id="@+id/title"
android:textColor="@color/black"
android:maxLines="2"
android:textSize="14dip"
/>
<ImageView
android:id="@+id/minus"
android:src="@drawable/minusbutton"
android:adjustViewBounds="true"
android:gravity="center"
/>
<ImageView
android:id="@+id/plus"
android:src="@drawable/plusbutton"
android:adjustViewBounds="true"
android:gravity="center"
/>
可绘制以更改加号按钮的状态:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:drawable="@drawable/button_add_normal_disabled" />
<item android:state_enabled="true"
android:state_pressed="true"
android:drawable="@drawable/button_add_pressed" />
<item android:state_enabled="true"
android:state_focused="true"
android:state_pressed="false"
android:drawable="@drawable/button_add_active" />
<item android:state_enabled="true"
android:state_focused="false"
android:state_pressed="false"
android:drawable="@drawable/button_add_normal" />
我希望你理解我的问题.我认为一个观点的所有孩子都受到父母的一个事件的影响,但我不确定.
你有解决方案吗?提前致谢
解决方法:
解决此问题的最简单方法是继承viewgroup并覆盖dispatchSetpressed.
这是一个例子
public class DuplicateParentStateAwareLinearLayout extends LinearLayout {
public DuplicateParentStateAwareLinearLayout(Context context) {
super(context);
}
public DuplicateParentStateAwareLinearLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public DuplicateParentStateAwareLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
/*
* By default ViewGroup call setpressed on each child view, this take into account duplicateparentstate parameter
*/
@Override
protected void dispatchSetpressed(boolean pressed) {
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
if (child.isDuplicateParentStateEnabled()){
getChildAt(i).setpressed(pressed);
}
}
}
}
使用此方法的catch是,您必须为您想要的每个项目和不应具有此行为的子项设置duplicateparentstate为true.
android – 在tabs开关中保存片段状态
这是一个星期我试图解决这个问题成功.请帮我.
我使用带有viewpager的标签导航.这是我放置标签和FragmentPagerAdapter类的类:
public class Detail extends SherlockFragmentActivity {
ViewPager mViewPager;
TabsAdapter mTabsAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
ActionBar bar = getSupportActionBar();
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
bar.setdisplayOptions(0, ActionBar.disPLAY_SHOW_TITLE);
mViewPager = (ViewPager)findViewById(R.id.pager);
// Add the tabs
mTabsAdapter = new TabsAdapter(this, bar, mViewPager);
mTabsAdapter.addTab(bar.newTab().setText(R.string.filmtab),
FragmentFilm.class, null);
mTabsAdapter.addTab(bar.newTab().setText(R.string.cinematab),
FragmentCinema.class, null);
mTabsAdapter.addTab(bar.newTab().setText(R.string.dintornitab),
FragmentPdi.class, null);
if (savedInstanceState != null) {
bar.setSelectednavigationItem(savedInstanceState.getInt("tab"));
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("tab", getSupportActionBar().getSelectednavigationIndex());
}
public static class TabsAdapter extends FragmentPagerAdapter
implements ViewPager.OnPagechangelistener, ActionBar.TabListener {
private final Context mContext;
private final ActionBar mBar;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
static final class TabInfo {
private final Class<?> clss;
private final Bundle args;
TabInfo(Class<?> _class, Bundle _args) {
clss = _class;
args = _args;
}
}
public TabsAdapter(Detail activity, ActionBar bar, ViewPager pager) {
super(activity.getSupportFragmentManager());
mContext = activity;
mBar = bar;
mViewPager = pager;
mViewPager.setAdapter(this);
mViewPager.setonPagechangelistener(this);
}
public void addTab(ActionBar.Tab tab, Class<? extends Fragment> clss, Bundle args) {
TabInfo info = new TabInfo(clss, args);
tab.setTag(info);
tab.setTabListener(this);
mTabs.add(info);
mBar.addTab(tab);
notifyDataSetChanged();
}
@Override
public int getCount() {
return mTabs.size();
}
@Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
return Fragment.instantiate(mContext, info.clss.getName(), info.args);
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mBar.setSelectednavigationItem(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
Object tag = tab.getTag();
for (int i=0; i<mTabs.size(); i++) {
if (mTabs.get(i) == tag) {
mViewPager.setCurrentItem(i);
}
}
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}
}
3个片段类都是一样的,我这里只复制一个;
在片段类中我使用异步任务来下载我需要放在视图中的数据,我在onActivityCreated方法中执行此操作:
public class FragmentFilm extends SherlockFragment
{
private Detail act;
private DetailedRec detail_film;
private View view;
private String a;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
setRetainInstance(true);
view = inflater.inflate(R.layout.tab_film_info, container, false);
return view;
}
/*
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
act = (Detail) getActivity();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
new DownloadFilmDetailAsyncTask().execute();
}
private class DownloadFilmDetailAsyncTask extends AsyncTask<Void, DetailedRec, Void>
{
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
ProgressBar prBar = (ProgressBar)getView().findViewById(R.id.progressbar_film);
prBar.setVisibility(View.GONE);
ScrollView lay = (ScrollView)getView().findViewById(R.id.tab_filmsummary);
lay.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(Void... params)
{
try
{
String locale = getResources().getConfiguration().locale.getdisplayName();
JSONObject objSend = new JSONObject();
objSend.put("idFilm", act.getIdFilm());
objSend.put("cinemaId",act.getIdCinema());
int ind = locale.indexOf("(");
String locale_send = locale.substring(0, ind-1);
objSend.put("locale", locale_send);
ArrayList<String> otherCin = new ArrayList<String>(Arrays.asList(act.getotherCinemas()));
JSONArray othCin = new JSONArray(otherCin);
objSend.put("otherCinemas", othCin );
JSONObject jsonObject = sendAndGetJSONObject(JSON_SERVER+"JsonServer?op=getFilmbyId",objSend);
DetailedRec detail_rec = new DetailedRec();
//FILM
detail_rec.setFilmId(jsonObject.getString("filmId"));
detail_rec.setName(jsonObject.getString("name"));
detail_rec.setimageUrl(jsonObject.getString("imageUrl").replace("640", "80"));
detail_rec.setActors(jsonObject.getString("actors"));
detail_rec.setGenre(jsonObject.getString("genre"));
detail_rec.setDirector(jsonObject.getString("director"));
detail_rec.setPlot(jsonObject.getString("plot"));
detail_rec.setYear(jsonObject.getString("year"));
detail_rec.setDuration(jsonObject.getString("duration"));
detail_rec.setTrailer(jsonObject.getString("trailer"));
detail_rec.setrating(jsonObject.getString("rating"));
detail_film = detail_rec;
publishProgress(detail_rec);
}
catch (IOException ignored)
{
}
catch (JSONException ignored)
{
}
return null;
}
@Override
protected void onProgressUpdate(DetailedRec... values)
{
for (final DetailedRec detail_rec : values)
{
updateViews(detail_rec);
}
}
private JSONObject getJSONObject(String url) throws IOException, MalformedURLException, JSONException
{
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
InputStream in = conn.getInputStream();
try
{
StringBuilder sb = new StringBuilder();
BufferedReader r = new BufferedReader(new InputStreamReader(new DoneHandlerInputStream(in),"WINDOWS_1252"));
for (String line = r.readLine(); line != null; line = r.readLine())
{
sb.append(line);
}
return new JSONObject(sb.toString());
}
finally
{
in.close();
}
}
private JSONObject sendAndGetJSONObject(String url,JSONObject request) throws IOException, MalformedURLException, JSONException
{
HttpClient client = new DefaultHttpClient();
httpconnectionParams.setConnectionTimeout(client.getParams(), 10000); //Timeout Limit
InputStream in=null;
try{
HttpPost post = new HttpPost(url);
StringEntity se = new StringEntity(request.toString());
se.setContentType((Header) new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
post.setEntity(se);
HttpResponse response = client.execute(post);
httpentity entity = response.getEntity();
in = entity.getContent();
StringBuilder sb = new StringBuilder();
BufferedReader r = new BufferedReader(new InputStreamReader(new DoneHandlerInputStream(in),"WINDOWS_1252"));
for (String line = r.readLine(); line != null; line = r.readLine())
{
sb.append(line);
}
return new JSONObject(sb.toString());
}catch(Exception e){
}
finally
{
in.close();
}
return null;
}
}
private void updateViews(final DetailedRec detail_rec){
//FILM
TextView filmName = (TextView) getView().findViewById(R.id.movieTitle);
filmName.setText(detail_rec.getName().trim());
TextView actors = (TextView) getView().findViewById(R.id.movieActor);
actors.setText(detail_rec.getActors().trim());
TextView genre = (TextView) getView().findViewById(R.id.movieGenre);
genre.setText(detail_rec.getGenre().trim());
TextView director = (TextView) getView().findViewById(R.id.movieDirector);
director.setText(detail_rec.getDirector().trim());
TextView plot = (TextView) getView().findViewById(R.id.moviePlot);
plot.setText(detail_rec.getPlot().trim());
TextView year = (TextView) getView().findViewById(R.id.movieYear);
year.setText(detail_rec.getYear().trim());
TextView duration = (TextView) getView().findViewById(R.id.movieDuration);
duration.setText(detail_rec.getDuration().trim());
ImageView image = (ImageView) getView().findViewById(R.id.moviePoster);
new DownloadImagesTask(detail_rec.getimageUrl().trim().replace("80", "100")).execute(image);
//image.setimageBitmap(downloadBitmap(detail_rec.getimageUrl().trim().replace("80", "100")));
//rating
if(detail_rec.getrating().compareto("N/A")!=0){
ratingBar rateBar = (ratingBar)getView().findViewById(R.id.MovieratingBar);
rateBar.setrating(Float.parseFloat(detail_rec.getrating()));
}
//Trailer
Button trailer = (Button)getView().findViewById(R.id.trailer);
if(detail_rec.getTrailer().compareto("")!=0){
trailer.setVisibility(View.VISIBLE);
trailer.setonClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int index = detail_rec.getTrailer().indexOf("v=");
String videoId="";
if(index!=-1){
videoId = detail_rec.getTrailer().substring(index+2); //"Fee5vbFLYM4";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:"+videoId));
intent.putExtra("VIDEO_ID", videoId);
startActivity(intent);
}
}
});
}
}
}
好的,在我的应用程序中,我希望片段加载一次.我解释得这么好:
当我启动Detail类时,片段类是istantiate并且所有3个片段中的AsyncTask开始,现在当用户从一个选项卡切换到另一个选项卡时我希望未选中选项卡中的片段不会丢失数据和视图,因为现在当我从一个选项卡切换到另一个选项卡,然后返回第一个重新创建的选项卡,再次调用onActivityCreated方法!
请帮助我,我在所有地方搜索,但我没有找到解决方案!
附:我使用SherlockActionBar,我不知道id是否相关.对不起,我的英语不好
谢谢
解决方法:
在实例化ViewPager之后,添加它
mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setoffscreenPageLimit(3);
应该这样做!
今天的关于android – 保存片段的状态?和android 保存数据的分享已经结束,谢谢您的关注,如果想了解更多关于android – Fragment中的ViewPager不会恢复子片段的状态、android – ViewPager里面的片段,怎么保留状态?、android – 单击ListView项目更改项目内元素的状态?、android – 在tabs开关中保存片段状态的相关知识,请在本站进行查询。
本文标签: