有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java片段在打开新片段并返回后“消失”

这很难解释,所以我拍下了问题的截图

这是我的主要活动。爪哇

我打开导航抽屉,点击里程碑,这将带我进入里程碑。爪哇

我在这里。java片段

现在工作很好

就是我想要的样子

但当我们离开里程碑,去其他任何地方,然后回来的时候,一切都会一团糟。所以我要去踢柜台

enter image description here

我在我的踢球台上。java片段

enter image description here

打开导航抽屉并返回里程碑

enter image description here

所以现在我有一个碎片月,从0到6,打开里程碑碎片。有些时候,从0月到6月和12月,lus片段在返回后不会立即出现,有时会出现。在这一点上,总是一团糟的是,除非重新启动应用程序,否则Months6到12片段将永远不会再次显示。另外,三个片段之间的交换在回来后很慢,但在第一次观看时从未进行过

给你。它去哪里了

youtube视频:https://www.youtube.com/watch?v=6yMYcluvqbs

在此处获取源:https://github.com/delaroy/RecyclerViewFragment

我从youtube视频中得到的代码几乎完全相同,但他的主要活动(我将其制作成里程碑片段)是一个活动,而我使用了一个片段,所以我想这可能与我的问题有关

里程碑。爪哇

public class Milestones extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;

private OnFragmentInteractionListener mListener;

public Milestones() {
    // Required empty public constructor
}

/**
 * Use this factory method to create a new instance of
 * this fragment using the provided parameters.
 *
 * @param param1 Parameter 1.
 * @param param2 Parameter 2.
 * @return A new instance of fragment Milestones.
 */
// TODO: Rename and change types and number of parameters
public static Milestones newInstance(String param1, String param2) {
    Milestones fragment = new Milestones();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_milestones, container, false);

    Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.toolbar);


    ViewPager viewPager = (ViewPager) rootView.findViewById(R.id.viewpager);
                                                 //dont know if this will work
    PagerAdapter pagerAdapter = new PagerAdapter(getFragmentManager(), getContext());
    viewPager.setAdapter(pagerAdapter);

    TabLayout tabLayout = (TabLayout) rootView.findViewById(R.id.tab_layout);
    tabLayout.setupWithViewPager(viewPager);

    for(int i = 0; i < tabLayout.getTabCount(); i++){
        TabLayout.Tab tab = tabLayout.getTabAt(i);
        tab.setCustomView(pagerAdapter.getTabView(i));
    }

    // Inflate the layout for this fragment
    return rootView;
}

// not boiler plate
@Override
public void onResume() {
    super.onResume();
}

// probably just adding extra menu dont need it
/*@Override
public boolean onCreateOptionsMenu(Menu menu){

    getMenuInflater().inflate(R.menu.main, menu);
    return true;

}
*/

//not boilerplate
@Override
public boolean onOptionsItemSelected(MenuItem item){
    int id = item.getItemId();

    if(id == R.id.action_settings){
        return true;
    }

    return super.onOptionsItemSelected(item);

}

//not boilerplate
class PagerAdapter extends FragmentPagerAdapter {

    String tabTitles[] = new String[]{"0-6 Months", "6-12 Months", "12+ Months"};
    Context context;

    public PagerAdapter(FragmentManager fm, Context context) {
        super(fm);
        this.context = context;
    }

    @Override
    public int getCount() {
        return tabTitles.length;
    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                return new Months0Through6();
            case 1:
                return new Months6Through12();
            case 2:
                return new Months12Plus();
        }

        return null;
    }


    @Override
    public CharSequence getPageTitle(int position){
        return tabTitles[position];
    }

    public View getTabView(int position){
        View tab = LayoutInflater.from(getContext()).inflate(R.layout.custom_tab, null);
        TextView tv = (TextView) tab.findViewById(R.id.custom_text);
        tv.setText(tabTitles[position]);
        return tab;
    }
}


// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        mListener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}

/**
 * This interface must be implemented by activities that contain this
 * fragment to allow an interaction in this fragment to be communicated
 * to the activity and potentially other fragments contained in that
 * activity.
 * <p>
 * See the Android Training lesson <a href=
 * "http://developer.安卓.com/training/basics/fragments/communicating.html"
 * >Communicating with Other Fragments</a> for more information.
 */
public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
}

米尔斯托内适配器。爪哇

public class MilestonesAdapter extends RecyclerView.Adapter<MilestonesAdapter.MyViewHolder> {

private String[] mDataset;

public static class MyViewHolder extends RecyclerView.ViewHolder{
    public CardView mCardView;
    public TextView mTextView;
    public MyViewHolder(View v){
        super(v);

        mCardView = (CardView) v.findViewById(R.id.card_view);
        mTextView = (TextView) v.findViewById(R.id.tv_text);

    }

}

public MilestonesAdapter(String[] myDataset){
    mDataset = myDataset;
}

@Override
public MilestonesAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_item, parent, false);
    MyViewHolder vh = new MyViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position){
    holder.mTextView.setText(mDataset[position]);
}

@Override
public int getItemCount() { return mDataset.length; }

只是从第0个月到第6个月。java,因为其他两个完全相同,只是字符串不同

public class Months0Through6 extends 安卓.support.v4.app.Fragment {

public Months0Through6() {
    // Required empty public constructor
}

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

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.fragment_blank, container, false);

    RecyclerView rv = (RecyclerView) rootView.findViewById(R.id.rv_recycler_view);
    rv.setHasFixedSize(true);
    MilestonesAdapter adapter = new MilestonesAdapter(new String[]{"Month 0 stuff", "Example Two", "Example Three", "Example Four", "Example Five" , "Example Six" , "Example Seven"});
    rv.setAdapter(adapter);

    LinearLayoutManager llm = new LinearLayoutManager(getActivity());
    rv.setLayoutManager(llm);

    return rootView;
}

}

主要活动。爪哇

public class MainActivity extends AppCompatActivity
    implements KickCounter.OnFragmentInteractionListener, MommyMetrics.OnFragmentInteractionListener, Milestones.OnFragmentInteractionListener, NavigationView.OnNavigationItemSelectedListener {

Intent shareIntent;
String sharetext = "Hey check out mommy-info here at http://www.mommy-info.com";
private WebView myWebView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    //Connects to www.mommy-info.com
    myWebView = (WebView)findViewById(R.id.webView_ID);
    WebSettings webSettings = myWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    myWebView.loadUrl("http://www.mommy-info.com");
    myWebView.setWebViewClient(new WebViewClient());

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}

@Override
public void onBackPressed() {

    //back button in navigation drawer logic
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    }
    //back button in webView logic
    else if(myWebView.canGoBack()){
        myWebView.goBack();
    }
    else if(getFragmentManager().getBackStackEntryCount() > 0) {
        getFragmentManager().popBackStack();
    }
    else{
        super.onBackPressed();
    }
}

@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;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {

    // Handle navigation view item clicks here.
    int id = item.getItemId();

    if (id == R.id.kick_counter_ID) {

        KickCounter kickCounter = new KickCounter();

        安卓.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.full_screen_ID, kickCounter).addToBackStack(null).commit();


    } else if (id == R.id.nav_mommy_metrics) {

        MommyMetrics mommyMetrics = new MommyMetrics();

        安卓.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.full_screen_ID, mommyMetrics).addToBackStack(null).commit();

    } else if (id == R.id.nav_milestones) {

        Milestones milestones = new Milestones();

        安卓.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.full_screen_ID, milestones).addToBackStack(null).commit();

    } else if (id == R.id.nav_manage) {

    } else if (id == R.id.nav_share) {

        shareIntent = new Intent(Intent.ACTION_SEND);
        shareIntent.setType("text/plain");
        shareIntent.putExtra(Intent.EXTRA_SUBJECT, "my app");
        shareIntent.putExtra(Intent.EXTRA_TEXT, sharetext);
        startActivity(Intent.createChooser(shareIntent, "share via"));

    } else if (id == R.id.nav_send) {

    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

@Override
public void onFragmentInteraction(Uri uri) {

}

共 (1) 个答案

  1. # 1 楼答案

    在需要使用getChildFragmentManager()的片段中,在片段中使用的片段管理器与在活动中使用的片段管理器相同。希望这会有所帮助