2016-10-20 5 views
0

UserProfile.java이라는 탭 활동을 만들었습니다. 많은 분들이 아시다시피, 이런 종류의 활동에는 기본적으로 마법이 발생하는 PlaceholderFragment이라는 내장 클래스가 있습니다. 당신이 볼 수 있듯이PlaceHolderFragment에서 AsyncTask를 실행 중 : " 'com.example.Activity.this'를 정적 컨텍스트에서 참조 할 수 없습니다.

public static class PlaceholderFragment extends Fragment { 

    private static final String ARG_SECTION_NUMBER = "section_number"; 


    public PlaceholderFragment() { 
    } 

    public static PlaceholderFragment newInstance(int sectionNumber) { 
     PlaceholderFragment fragment = new PlaceholderFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
     fragment.setArguments(args); 
     return fragment; 
    } 

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

     // Some code related to database queries irrelevant to this question... 

     if (getArguments().getInt(ARG_SECTION_NUMBER) == 1) { 
      View profileView = inflater.inflate(
        R.layout.fragment_user_profile_data, 
        container, 
        false 
      ); 

      // Here's some code intended to get edittext's values irrelevant to this question... 

      final Button saveProfile = (Button) profileView.findViewById(R.id.profile_save_data); 

      saveProfile.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 

        UpdateProfileForm upf = new UpdateProfileForm(
          userName.getText().toString(), 
          userLastName.getText().toString(), 
          userID.getText().toString(), 
          userPhone.getText().toString(), 
          userEmail.getText().toString(), 
          userAddress.getText().toString() 
        ); 

        new UpdateProfile().execute(upf); 
        view.setVisibility(View.GONE); 
       } 
      }); 
      return profileView; 


     } else if (getArguments().getInt(ARG_SECTION_NUMBER) == 2) { 
      View profileView = inflater.inflate(R.layout.another_fragment, container, false); 
      return profileView; 
     } else { 
      View profileView = inflater.inflate(R.layout.fragment_user_profile_data, container, false); 
      return profileView; 
     } 
    } 
} 

, 나는 내가 사용자의 데이터를 얻을 경우 양식 조각이 fragment_user_profile_data라고해야하는 UpdateProfileForm 클래스는 UpdateProfile는 사용자 정보를 업데이트하는 데 사용라는를 저장하고 AsyncTask를에 전달하기 위해 다음과 같이 내 보인다 saveProfile 버튼을 클릭하면 서버 쪽에서 • 그래도 라인

new UpdateProfile().execute(upf);

'com.example.UserProfile.this'를 시도하는 경우

그러나, 정적 컨텍스트

오류에서 참조 할 수 없습니다 Android Studio에서 표시됩니다. PlaceholderFragment 클래스에서 "정적"속성을 해제하거나 내 AsyncTask를 정적으로 만들지 만 둘 중 어느 것도 작동하지 않는다고 들었습니다.

나는 이것으로 인해 도움이 될 것입니다.

+0

정말 'ARG_SECTION_NUMBER'에 따라 하나의 Fragment가 세 가지 별도의 책임을 처리하는 대신 세 개의 개별 Fragment 클래스를 사용해야합니다 –

+0

@ cricket_007이 작업을 수행하는 방법에 대해 자세히 알려주시겠습니까? 그것은 올바른 방법 (그리고 내가 원하는 방식으로) 들리는 것처럼 들리지만, 본 적이있는 유일한 Tabbed Activity 튜토리얼은이 자리 표시 자 단편을 사용합니다. –

+0

TabLayout에 첨부 된 ViewPager의 PagerAdapter가 위치 기반의 Fragment를 결정합니다 –

답변

0

기본적으로 his comment to my question에 언급 된 @ cricket_007과 같이 세 가지 별도의 책임에 대해 단일 조각 (PlaceholderFragment)을 사용했기 때문에 내가 한 일은 잘못되었습니다.

내가 찾은 것은 TabbedActivity tutorial입니다.

기본적으로 TabbedActivity로 작업 할 때 PlaceholderFragment가 필요 없으므로 쉽게 제거 할 수 있습니다.이제 활동에서 발생하는 SectionsPagerAdapter 클래스의 getItem 방법, 위치 인수 switch 문에 다음 줄을

return PlaceholderFragment.newInstance(position + 1);

를 교체하고 적절한 조각의 인스턴스를 돌려줍니다. 즉 :

public Fragment getItem(int position) { 
    switch (position) { 
     case 0: 
      UserProfileData tab1 = new UserProfileData(); 
      return tab1; 
     case 1: 
      UserProfileCollections tab2 = new UserProfileCollections(); 
      return tab2; 
     case 2: 
      UserProfileBalance tab3 = new UserProfileBalance(); 
      return tab3; 
     default: 
      return null; 
    } 
} 

마지막으로, AsyncTask를 그리고 조각 클래스에 폼 클래스를 선언하고 EditTexts '값과 조각의 onCreateView 방법 내에서 버튼의 기능을 설정 한 다음 그것을 팽창하고 돌아갑니다.

이 활동에 대한 샘플이 부족할 경우이 답변으로 도움이되기를 바랍니다. 어쨌든 귀하의 답변 주셔서 감사합니다!

0

정적 메서드에서 MyActivity.this을 호출 할 수 없습니다. 해결 방법이 있습니다.

이처럼 Activity/ Fragment에서 변수를 선언 : 다음

private static Activity activity; 

당신의 onCreate()에 : 다음

activity = this; 
// OR 
activity = getActivity(); // if you are in fragment 

과를, 당신의 UpdateProfile() AsyncTask를 방법으로, 다음과 같이 호출 :

activity.someMethod(); 
0

삭제 Fragment의 tatic 키워드

public static class PlaceholderFragment extends Fragment 

및 별도의 클래스에 UpdateProfile AsyncTask를 이동합니다. 이제는 다른 조각의 내부 클래스처럼 보입니다.