2

조각이있는 활동이 있으며, 이것을 FirstFragment이라고합시다. 이 단편에는 다른 단편 인 SecondFragment을 포함하는 프레임 작성이 있습니다. SecondFragment을 클릭하면 ThirdFragment가 해고됩니다. 다시 버튼을 누를 때 SecondFragment으로 돌아갈 수 있어야합니다. 그러나 뒤로 버튼을 클릭하면 활동이 닫힙니다. 여기에 내 코드입니다 :내부 조각에서 뒷면이 작동하지 않습니다.

MainActivity.java

public class MainActivity extends AppCompatActivity{ 
    ViewPager viewPager; 
    String[] titles; 
    SecondFragment secondFragment; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     FragmentPagerAdapter fragment = new FragmentPagerAdapter(getSupportFragmentManager()); 
     viewPager = findViewById(R.id.viewPager); 

     viewPager.setAdapter(fragment); 

     firstFragment = new FirstFragment(); 

    } 

    public class FragmentPagerAdapter extends android.support.v4.app.FragmentPagerAdapter { 

     public FragmentPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0 : return FirstFragment.newInstance("hi"); 
       default: return new OtherFragment(); 
      } 
     } 

     @Override 
     public int getCount() { 
      return 3; 
     } 
    } 

    @Override 
    public void onBackPressed() { 
     if (getFragmentManager().getBackStackEntryCount() > 0) { 
      getFragmentManager().popBackStack(); 
     } else { 
      super.onBackPressed(); 
     } 
    } 
} 

FirstFragment.java

public class FirstFragment extends Fragment implements RecyclerViewListener { 


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


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     Fragment secondFragment =SecondFragment.newInstance("hi"); 
     FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); 
     transaction.replace(R.id.frameLayout, secondFragment).commit(); 



     return inflater.inflate(R.layout.fragment_first, container, false); 
    } 


    public static FirstFragment newInstance(String text) { 

     FirstFragment f = new FirstFragment(); 
     Bundle b = new Bundle(); 
     b.putString("msg", text); 

     f.setArguments(b); 

     return f; 
    } 

    @Override 
    public void clicked(int position) { 
     Fragment productDetailFragment = ThirdFragment.newInstance(position); 
     FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); 
     transaction.add(R.id.frameLayout, productDetailFragment).addToBackStack(null).commit(); 



     Toast.makeText(getContext(), "pos : " + position, Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public boolean longClicked(int position) { 
     return false; 
    } 

} 

SecondFragment.java

public class SecondFragment extends Fragment { 
    RecyclerView recyclerView; 
    static ArrayList<Item> items; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_second, container, false); 

     recyclerView = v.findViewById(R.id.recyclerView); 
     recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 

     items = new ArrayList<>(); 

     for (int i = 0; i < 100; i++) { 
      Item item = new Item(R.drawable.accept_state, "esm" + i, Integer.toString(i * 100)); 
      items.add(item); 
     } 

     recyclerView.setAdapter(new RecylcerViewAdapter(getContext(), (RecyclerViewListener) getParentFragment(), items)); 


     return v; 
    } 

    public static SecondFragment newInstance(String text) { 

     SecondFragment f = new SecondFragment(); 
     Bundle b = new Bundle(); 
     b.putString("msg", text); 

     f.setArguments(b); 

     return f; 
    } 

} 

ThirdFragment.java

public class ThirdFragment extends android.support.v4.app.Fragment { 

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

     View v = inflater.inflate(R.layout.fragment_third, container, false); 


     return v; 
    } 


    public static ThirdFragment newInstance(int position) { 

     ThirdFragment f = new ThirdFragment(); 
     Bundle b = new Bundle(); 

     f.setArguments(b); 

     return f; 
    } 
} 
아래와 같이

RecyclerViewListener.java

public interface RecyclerViewListener { 
    void clicked(int position); 
    boolean longClicked(int position); 
} 

RecyclerViewAdapter.java 모든

public class RecylcerViewAdapter extends RecyclerView.Adapter<RecylcerViewAdapter.RecyclerViewHolder>{ 
    private Context context; 
    private RecyclerViewListener recyclerViewListener; 
    private ArrayList<Item> items; 

    public RecylcerViewAdapter(Context context, RecyclerViewListener recyclerViewListener, ArrayList<Item> items) { 
     this.context = context; 
     this.recyclerViewListener = recyclerViewListener; 
     this.items = items; 
    } 

    @Override 
    public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(context).inflate(R.layout.recycler_item, parent, false); 
     RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(view); 
     return recyclerViewHolder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerViewHolder holder, int position) { 
     holder.bind(position); 
    } 

    @Override 
    public int getItemCount() { 
     return items.size(); 
    } 

    public class RecyclerViewHolder extends RecyclerView.ViewHolder { 
     ImageView imageView; 
     TextView name; 
     TextView cost; 
     public RecyclerViewHolder(View itemView) { 
      super(itemView); 
      itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        recyclerViewListener.clicked(getAdapterPosition()); 
       } 
      }); 
      itemView.setOnLongClickListener(new View.OnLongClickListener() { 
       @Override 
       public boolean onLongClick(View view) { 
        return recyclerViewListener.longClicked(getAdapterPosition()); 
       } 
      }); 
      imageView = itemView.findViewById(R.id.image); 
      name = itemView.findViewById(R.id.name); 
      cost = itemView.findViewById(R.id.cost); 
     } 

     public void bind(int position) { 
      Item item = items.get(position); 
      imageView.setImageResource(item.getImageID()); 
      name.setText(item.getName()); 
      cost.setText(item.getCost()); 
     } 
} 

} 

답변

1

먼저 onBackPressed() 무시하고 사용 getChildFragmentManager()을 사용 공개 무효() {

// If the fragment exists and has some back-stack entry 
    if (myFragment != null && mytFragment.getChildFragmentManager().getBackStackEntryCount() > 0){ 
     // Get the fragment fragment manager - and pop the backstack 
     myFragment.getChildFragmentManager().popBackStack(); 
    } 
    // Else, nothing in the direct fragment back stack 
    else{ 
     // Let super handle the back press 
     super.onBackPressed();   
    } 
} 
onBackPressed
관련 문제