개발 과정에서 Fragment 사용에 관한 사항

5800 단어 Android
앞에 쓰기:
최근 1년 동안 블로그를 업데이트하지 않은 것을 갑자기 발견했다. 한편으로는 자신의 게으름 때문이고, 다른 한편으로는 회사를 바꾼 후 업무 스트레스가 커지면서 많은 정력과 시간을 유지하지 못했기 때문이다.내가 보기에 블로그는 경험을 기록하고 공유하는 플랫폼이다.이 한 해 동안 저는 기술 초보자로부터 혼자서 팀을 이끌고 프로젝트를 개발하고 유지보수하기 시작했습니다. 바쁘지만 각 방면에서 어느 정도 진보했습니다.
Fragment이 무엇인지, 그것의 생명 주기, 어떤 작용을 하는지에 대해 나는 여기에 더 이상 소개하지 않겠다.현재 대부분의 앱의 첫 페이지는 Frame Layout의 밑에 Tab을 설치하여 Fragment 스타일을 전환하는 데 사용한다.그러나 개발 과정에서 여전히 주의해야 할 문제가 많다.
이 문서의 내용:
1. Activity와 Fragment 간의 데이터 전달
1. Activity가 Fragment에 데이터를 전달
우선, 우리는Activity와Fragment를 만들고 대응하는 클릭 이벤트를 추가하면 대응하는 레이아웃 파일을 붙이지 않을 것이다. 문서의 끝에 있는 링크는 다운로드할 수 있는 demo가 있을 것이다.
저는 Fragment가 모두 같은 것을 복용하기 때문에 Fragment 내부에 직접 대상을 만드는 방법을 추가했습니다. 먼저 코드를 보십시오.
public class TestFragment extends Fragment {

    private TextView tv_info;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_test, container, false);
        tv_info = (TextView) view.findViewById(R.id.tv_info);
        Bundle args = getArguments();
        if (args != null) {
            String content = args.getString("content");
            tv_info.setText(content);
        }


        return view;
    }


    public static TestFragment newInstance(String content) {
        TestFragment testFragment = new TestFragment();
        Bundle bundle = new Bundle();
        bundle.putString("content", content);
        testFragment.setArguments(bundle);
        return testFragment;
    }
}

newInstance (String content) 를 통해 대상을 만들었습니다. 이 방법은Activity에서 직접 호출하면 되고, 이 인터페이스의 TextView 내용을 설정하는 데 사용될 String 형식의 데이터를 전송합니다.
중점: 데이터 전송에 사용할 Bundle 대상을 만들고 콘텐츠 값을 전송합니다.
이제 Activity 를 살펴보겠습니다.
public class MainActivity extends FragmentActivity implements View.OnClickListener{
        private TextView tv_tab1,tv_tab2,tv_tab3;

        private TestFragment f1,f2,f3;
        private FragmentManager manager;
        private FragmentTransaction transaction;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);

            manager = getSupportFragmentManager();
            transaction = manager.beginTransaction();

            tv_tab1 = (TextView) findViewById(R.id.tv_tab1);
            tv_tab2 = (TextView) findViewById(R.id.tv_tab2);
            tv_tab3 = (TextView) findViewById(R.id.tv_tab3);
            
            tv_tab1.setOnClickListener(this);
            tv_tab2.setOnClickListener(this);
            tv_tab3.setOnClickListener(this);

            /**
             *          
             */
//            rGroup.check(R.id.rb_1);
            f1 = TestFragment.newInstance("FIRST");
            transaction.replace(R.id.fl_main, f1);
            transaction.commit();
        }

        @Override
        public void onClick(View v) {

            manager = getSupportFragmentManager();
            transaction = manager.beginTransaction();

            switch (v.getId()) {
                case R.id.tv_tab1 :
                    /**
                     *       ,     Fragment
                     */
                    hideFragment(transaction);
                    f1 = TestFragment.newInstance("FIRST_FRAGMENT");
                    transaction.replace(R.id.fl_main, f1);
                    transaction.commit();

                    break;
                case R.id.tv_tab2 :
                    hideFragment(transaction);
                    f2 = TestFragment.newInstance("SECOND_FRAGMENT");
                    transaction.replace(R.id.fl_main, f2);
                    transaction.commit();

                    break;
                case R.id.tv_tab3 :
                    hideFragment(transaction);
                    f3 = TestFragment.newInstance("THIRD_FRAGMENT");
                    transaction.replace(R.id.fl_main, f3);
                    transaction.commit();
                    break;

                default :
                    break;
            }
        }

        /*
         *    Fragment
        */
        private void hideFragment(FragmentTransaction transaction) {
            if (f1 != null) {
                transaction.remove(f1);
            }
            if (f2 != null) {
                transaction.remove(f2);
            }
            if (f3 != null) {
                transaction.remove(f3);
            }


        }
    }

코드 분석:
우리는 이 두 줄 코드를 통해 Fragment 사무 관리자를 열고 그것을 열었다
 manager = getSupportFragmentManager();
            transaction = manager.beginTransaction();

이어 Fragment의 newInstance 방법으로 Fragment을 만들고 다음 두 줄 코드를 통해 FrameLayout을 이 Fragment의 실례로 대체하고 이 이벤트를 제출하여 첫 페이지에 첫 번째 Fragment의 내용을 표시합니다
transaction.replace(R.id.fl_main, f1);
            transaction.commit();

Fragment 간 전환은 다음과 같습니다.
클릭 이벤트를 터치한 후, 우리는 다음과 같은 진보적인 조작을 진행할 것이다. (칠판을 두드리기)
1. 모든 Fragment을 숨기고 hideFragment() 방법을 사용합니다. 원리는 먼저 Fragment 대상이 비어 있는지 판단하고 비어 있으면 제거하는 것입니다. 이로써 Fragment의 중첩을 효과적으로 피할 수 있습니다.
2, 이전 단계 반복, Framelayout 교체, 트랜잭션 제출
이제 데모를 열고 밑에 있는 Tab을 전환합니다.Activity를 통해 모든 Fragment에 값을 부여하고, 각각의 Fragment에 있는 TextView 내용을 다르게 합니다.
2. Fragment가 Activity에 데이터를 전달
Activity가 Fragment에 데이터를 전송하는 것보다 Fragment가Activity에 데이터를 전송하는 것은 약간 복잡하다. 나는 업무 중에 세 가지 방안을 자주 사용한다.
1. 리셋 인터페이스를 통해
2、퍼블릭 공개 방법을 통해fragment에서 호출하면 된다
getContext () instanceof MainActivity를 통해 getContext ()를fragment가 있는 activity로 설정하고 그 방법을 직접 호출하면 됩니다
3. EventBus 이벤트 버스 도구를 통해 구조가 복잡한 데이터를 쉽게 전송할 수 있다.
데모 다운로드

좋은 웹페이지 즐겨찾기