当前位置: 首页 > 知识库问答 >
问题:

为什么当前片段的oncreateview会在按下后退按钮时被调用?

乐正烨熠
2023-03-14

我正试着从后面取回碎片。它正在被检索,但问题是在按下后退按钮时,当前片段的oncreate视图和后续lifecyce方法也会被调用。下面是我将片段放入backbackback的代码:

fragment=new FileTrackingFragment();
bundle=new Bundle();
bundle.putString("name","Dak Monitoring");
bundle.putInt("num",2);
fragment.setArguments(bundle);
ft.replace(R.id.parent, fragment, fragment.getClass().getName());
ft.addToBackStack(fragment.getClass().getName());
ft.commit();
break;

以下是片段的代码:

package com.example.rajvirsingh.epunjaboffice.DakMonitoring;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.percent.PercentRelativeLayout;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.example.rajvirsingh.epunjaboffice.FileTracking.HistoryAdapter;
import com.example.rajvirsingh.epunjaboffice.MainActivity;
import com.example.rajvirsingh.epunjaboffice.R;
import com.example.rajvirsingh.epunjaboffice.Utility.Constants;
import com.example.rajvirsingh.epunjaboffice.Utility.SessionManager;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.RequestParams;
import com.loopj.android.http.TextHttpResponseHandler;

import org.json.JSONArray;

import java.util.ArrayList;

import cz.msebera.android.httpclient.Header;

/**
 * Created by rajvirsingh on 07/03/17.
 */

public class ConsolidatedReportFragment extends Fragment implements AdapterView.OnItemSelectedListener {
  SessionManager sessionManager;
  JSONArray consolidatedRJsonArray;
  String userCode,branchCode;
  MainActivity mainActivity;
  Spinner spinDuration;
  String selectedDuration="";
  ProgressDialog pDialog;
  TextView error,serial;
  PercentRelativeLayout pl;
  PercentRelativeLayout ll;
  RecyclerView recyclerView;
  AsyncHttpClient client = new AsyncHttpClient();
  String []durationValues={"This Week","This Month","This Year","Total"};


  @Nullable
  @Override
  public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_dak_monitoring_consolidated,container,false);
  }


  @Override
  public void onAttach(Activity activity) {
    super.onAttach(activity);
    sessionManager=SessionManager.NewInstance(activity);
    userCode=sessionManager.pref.getString("usercode","");
    branchCode=sessionManager.pref.getString("branchcode","");
    mainActivity=(MainActivity) getActivity();
    if(((AppCompatActivity) getActivity()).getSupportActionBar()!=null) {
      ((AppCompatActivity) getActivity()).getSupportActionBar().show();
      mainActivity.setToolbarTitle("Consolidated Report");
      mainActivity.unlockDrawer();
      mainActivity.loadNavigationMenu(R.menu.menu_dak_monitoring);
    }
  }

  @Override
  public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    pDialog = new ProgressDialog(getActivity(),R.style.DialogStyle);
    pDialog.setMessage("Loading...");
    pDialog.setTitle("Office Management");
    pDialog.setIndeterminate(true);
    pDialog.setCancelable(true);

    sessionManager=SessionManager.NewInstance(getActivity());

    error=(TextView)view.findViewById(R.id.err);
    serial=(TextView)view.findViewById(R.id.serial);


    spinDuration=(Spinner)view.findViewById(R.id.spin_duration);
    ArrayAdapter<String> arrayAdapter=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_item,durationValues);
    arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinDuration.setAdapter(arrayAdapter);
    spinDuration.setOnItemSelectedListener(this);
    spinDuration.setSelection(0);
    selectedDuration="1";

    pl=(PercentRelativeLayout)view.findViewById(R.id.percentile);

    ll=(PercentRelativeLayout) view.findViewById(R.id.ll1);
    recyclerView=(RecyclerView)view.findViewById(R.id.recyclerView);

    if(Constants.isOnline(getActivity()))
    {

      getConsolidatedReport();
    }
  }

  void getConsolidatedReport()
  {
    RequestParams params = new RequestParams();
    params.put("_userMasterCode",userCode);
    params.put("_parameter", selectedDuration);
    String url=getString(R.string.urlGetConsolidatedMonitoringReport);

    client.get(url, params, new TextHttpResponseHandler() {
      @Override
      public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
        pDialog.dismiss();
        ll.setVisibility(View.GONE);
        recyclerView.setVisibility(View.GONE);
        error.setVisibility(View.VISIBLE);
        if(getView()!=null)
          Snackbar.make(getView(), "Error!", Snackbar.LENGTH_LONG).show();
      }

      @Override
      public void onSuccess(int statusCode, Header[] headers, String responseString) {

        try {
          pDialog.dismiss();
          int p1 = responseString.indexOf(">");
          int p2 = responseString.lastIndexOf("<");
          String r = responseString.substring(p1 + 1, p2);
          p1 = r.indexOf(">");
          r = r.substring(p1 + 1, r.length());
          ll.setVisibility(View.VISIBLE);
          recyclerView.setVisibility(View.VISIBLE);
          error.setVisibility(View.GONE);
          consolidatedRJsonArray = new JSONArray(r);
          ConsolidatedReportAdapter consolidatedReportAdapter=new ConsolidatedReportAdapter(consolidatedRJsonArray,getActivity());
          recyclerView.setAdapter(consolidatedReportAdapter);
          recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        } catch (Exception e) {
          if (getActivity() != null && isAdded()) {
            ll.setVisibility(View.GONE);
            recyclerView.setVisibility(View.GONE);
            error.setVisibility(View.VISIBLE);
            if(getView()!=null)
              Snackbar.make(getView(), "No Information Exist! For Selection", Snackbar.LENGTH_LONG).show();
            else
              Toast.makeText(getActivity(),"No Information Exist! For Selection",Toast.LENGTH_LONG).show();
            pDialog.dismiss();
          }
        }
      }
    });
  }

  @Override
  public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    switch (parent.getId())
    {
      case R.id.spin_duration:
        selectedDuration=String.valueOf(position+1);
        getConsolidatedReport();
        break;
    }
  }

  @Override
  public void onNothingSelected(AdapterView<?> parent) {

  }

  @Override
  public void onPause() {
    super.onPause();
    pDialog.dismiss();
  }

  @Override
  public void onStop() {
    client.cancelAllRequests(true);
    super.onStop();
  }

}

共有1个答案

满言
2023-03-14

当你移动到下一个片段时,它会调用你的视图被破坏,所以它会要求在按下后退按钮时再次查看,这应该是保持片段视图(目前不可见)在内存中会导致内存问题的方法上。它是一个不会被再次调用的方法。

如果您不想在返回时调用onCreateView,请使用ft.add(R.id.parent,fragment,fragment.getClass()。getName())

有关片段堆栈行为的更多详细信息,请参阅此处。

 类似资料:
  • 在活动A中,我可以查看。我在活动A中按下了一个编辑按钮,它启动活动B(并关闭A)。在代码中,我将带有意图的字符串从A传递到B,如下所示: 在活动A中,我有: 但是文本框是空的。 你能告诉我该如何把值从B传递回A吗?

  • 问题内容: 我想在片段类中禁用后退按钮。在此片段中似乎不起作用。如何禁用后退按钮? 这是我的示例代码: 问题答案: 您必须重写父FragmentActivity类的onBackPressed。因此,将您的代码放在父FragmentActivity中。或者,您可以使用以下方法调用父方法: 在FragmentActivity中重写onBackPressed方法,而不调用其超类来禁用后退按钮。

  • 在写这个之前,我已经经历了很多stackoverflow问题。我对这个家伙的碎片背栈很困惑。 我在一个活动中的同一个容器上添加了三个片段 现在我想要的是,当用户按下片段3上的后退按钮时,它应该出现在第一个片段上,所以我已经覆盖了onBackPressed()方法。 但屏幕上什么也没发生,它让片段3继续运行。 更新 任何实现这一点的解决方案。

  • 我对libGDX有一个问题,当我用后退按钮退出后恢复应用程序时,只有一个白色屏幕。 实际应用运行,接受触摸输入,播放声音,但屏幕只是白色。 我读过保持对纹理的静态引用可能会导致这个问题,但我没有这样做。 下面是我的资产代码如何工作的简化版本。 在按下后退按钮后返回应用程序时,重新创建AssetManager,重新打开SplashScreen(为白色),并更新AssetManager直到重新加载所有

  • 我正在编写一个android应用程序,使用框架布局和片段作为其组件。 我有3个片段:、、。 在社区片段中,用户按下一个按钮来创建一个任务。然后TaskFromFrament用替换FrameLayout中的社区片段。因为在那之后,我想用后退按钮返回社区片段。 在TaskFormFragment中,用户按create按钮创建任务。然后TaskFragment打开,没有添加堆栈,因为我不想在按下后退按钮

  • 我正在使用android导航组件库。我用导航图设置了两个片段。我想在我的片段内按下后退按钮时做一些额外的动作。 我使用这段代码来处理工具栏上的按钮点击,但我也想处理后退按钮按下。我该怎么做?