Fragment에서 button 점프 및 DrawLayout Framelayout 충돌 클릭
6019 단어 Fragment 점프DrawLayout 붕괴Android
[주제에 직접 삽입]:
이때 당신은 반드시 1개 이상의fragment를 세웠을 거라고 믿습니다. 단지 전환 조작으로 어떻게 갑니까?
희망하는 것은fragmentA에서 무엇을 클릭하면fragmentB로 전환할 수 있는지
하지만 모든 Fragment는 해당 바인딩을 호스팅하는 Activity입니다.
스스로 전환하려면 어림없어!전환하려면 먼저 맏형 Activity의 동의를 물어본 다음에 맏형이 전환해야 한다!
이 글은 제 블로그'Fragment'의 장과 절, 맏형과 동생의 이야기를 추천할 줄 모릅니다.
그 다음에 우리의 논리는 전환이 필요한 모든 Fragment가 맏형에게 보고서를 써서 전환하는 것이다. 이것은 비교적 간단한 방법인 것 같다.
또한 옳다. 단지 모든fagment가 쓴 보고서는 이곡동공일 뿐이다. 어떻게 작업량을 줄일 것인가?
[추상류와 무엇이든 맏형에게 맡겼으면 좋겠다.]
일단 Fragment에서 할 일을 볼게요.
view=View.inflate(main, R.layout.create_frame, null);
모든fragment가 해야 할 일은 추상적인 유형을 만들고 추상적인 방법을 써서 이 중복된 방법을 대체한다.
코드는 다음과 같습니다.
package com.example.testdrawerlayoutleft;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public abstract class BaseFragment extends Fragment {
public Main main;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
main = (Main) getActivity();
View view = initView();
return view;
}
public abstract View initView();
}
그리고 모든 fagment로 하여금 이 추상 클래스를 계승하게 한다.
package com.example.testdrawerlayoutleft;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class fragment_content extends BaseFragment {
private View view;
private Button create;
@Override
public View initView() {
// TODO Auto-generated method stub
if(view==null){
view=View.inflate(main, R.layout.fragment_content, null);
create=(Button)view.findViewById(R.id.creat_bt);
create.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// Toast.makeText(main, "sdsd", 100).show();
main.switchFragment("content", "create");
}
});
}
return view;
}
}
여기에 클릭을 설정하면 이 단추는 다른 Fragment로 이동합니다
그러면 우리 Activity는 다음과 같이 쓸 수 있습니다.
public void switchFragment(String fromTag, String toTag) {
Fragment from = fragmentManager.findFragmentByTag(fromTag);
Fragment to = fragmentManager.findFragmentByTag(toTag);
if (mCurrentFragment != to) {
mCurrentFragment = to;
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if (!to.isAdded()) {// Activity
fragmentTransaction.hide(from).add(R.id.content_frame, to).commit();
} else {
fragmentTransaction.hide(from).show(to).commit();
}
}
}
/**
【주의의 구덩이】:
Fragment Manager 객체는 처음 만든 후 계속 사용할 수 있습니다.
하지만!!!!!FragmentTransactionfragmentTransaction은 매번 추가를 전환할 때 다시 한 번 설명해야 합니다. 그렇지 않으면
붕괴되지 않는 상상이 생겨서 블로그를 많이 봤어요. 사용할 때 매번 사용해야 해요. 성명할 때마다 구체적인 원리는 몰라요. 원리를 찾아서 알려드릴게요. 그런데 이 구덩이!!부디 신중히 밟아라
여기까지 거의 다 끝났어요.
마지막으로 Main Activity에 디스플레이 코드만 추가하면
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager
.beginTransaction();
fragmentTransaction.add(R.id.content_frame,fragment_content, "content").add(R.id.content_frame,Create_frame, "create").hide(Create_frame).commit();
main의 xml 파일은 다음과 같습니다.
마지막:
바로 DrawLayout을 사용할 때 존재하는 Framelayout 충돌입니다. 왜 DrawLayout에 FrameLayout이 필요한지 모르겠지만 Fragment에 필요한 디스플레이 contianer는 DrawLayout이 같은 직접적인 충돌을 사용하면 안 됩니다. 해결 방법은 간단합니다. FrameLayout을 디스플레이 레이아웃으로 하나 더 쓰면 해결이 편리해 보입니다.그러나 당시 이 문제를 발견했을 때는 이틀이 지났고 큰 구덩이급이었다.
예시 코드 데모는 아래에서 다운로드해서 사용하십시오. 질문이 있으면 평론으로 연락하십시오.
4
4