2012-01-04 2 views
3

아래 코드는 Android 자바 튜토리얼에서 사용하고 있습니다.코드를 onCreate 메소드에서 자신의 클래스 파일로 옮깁니다.

코드는 모두 앱의 기본 자바 파일 onCreate 메소드에 있으며 XML 처리 부분을 별도의 클래스로 옮기고 싶습니다.

나는이 여러 가지 방법을 시도했지만, 모두 끔찍하게 실패하고 결국 가치가 있다는 점에서 더욱 성가 셨습니다.

내 질문은 거기에 코드를 주 Java 파일 밖으로 이동하고 별도의 클래스로 좋은/표준 방법은 무엇입니까?

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    TextView myXmlContent = (TextView)findViewById(R.id.my_xml); 
    String stringXmlContent; 

    try { 
      stringXmlContent = getEventsFromAnXML(this); 
      myXmlContent.setText(stringXmlContent); 
     } catch (XmlPullParserException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    private String getEventsFromAnXML(Activity activity) 
      throws XmlPullParserException, IOException 
    { 
     StringBuffer stringBuffer = new StringBuffer(); 
     Resources res = activity.getResources(); 
     XmlResourceParser xpp = res.getXml(R.xml.myxml); 
     String elType = "mt"; 
     int counter = 1; 
     int mainTopics = 0; 
     int subTopics = 0; 
     xpp.next(); 

     int eventType = xpp.getEventType(); 
     while (eventType != XmlPullParser.END_DOCUMENT) 
     { 
      if(eventType == XmlPullParser.START_DOCUMENT) 
      { 
       stringBuffer.append("News Categories"); 
      } 
      else if(eventType == XmlPullParser.START_TAG) 
      { 
       if(xpp.getName().equalsIgnoreCase("subTopic")) { 
        elType = "st"; 
        subTopics += 1; 
       } else if(xpp.getName().equalsIgnoreCase("mainTopic")) { 
        elType = "mt"; 
        mainTopics += 1; 
       } else { 
        elType = ""; 
       } 
       //stringBuffer.append("\nSTART_TAG: "+xpp.getName()); 
      } 
      else if(eventType == XmlPullParser.END_TAG) 
      { 
       //stringBuffer.append("\nEND_TAG: "+xpp.getName()); 
      } 
      else if(eventType == XmlPullParser.TEXT) 
      { 
       if(elType.equalsIgnoreCase("st")) { 
        stringBuffer.append("\n   *"+xpp.getText()); 
       } else { 
        stringBuffer.append("\n " + counter + ") " + xpp.getText()); 
        counter+= 1;  
       } 
      } 
       eventType = xpp.next(); 
     } 
     //stringBuffer.append("\n--- End XML ---"); 
     stringBuffer.append("\n Total Topics: " + mainTopics + " Total SubTopics: " + subTopics); 
     return stringBuffer.toString(); 
    } 

나는이 작업을 얻었다 :

 readXML processXml = new readXML(); 

    try { 
      stringXmlContent = processXml.getEventsFromAnXML(this); 
      myXmlContent.setText(stringXmlContent); 
     } catch (XmlPullParserException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

난 그냥 새 클래스 같은

의 방법 "개인 문자열 getEventsFromAnXML을 「랩이 같이되는 ReadXml라는 다른 클래스로 이동 :

public class readXML { 

private String getEventsFromAnXML(Activity activity) 
     ....process XML... 
} 
+1

'getEventsFromAnXML' 메서드를 사용하여 코드를 별도의 클래스로 옮기려고하는지 명확하지 않습니다. –

+1

정확히 무엇을 의미합니까? 코드를 밖으로 이동 어디 ?? 당신의 질문을 다시 할 수 있습니까? – akkilis

+0

죄송합니다 ... 작동하도록했습니다. 위의 원래 게시물을 편집했습니다. 내 말은, "getEventsFromAnXML"메서드를 자체 클래스로 옮기고 싶었습니다. – SkyeBoniwell

답변

1

당신이 할 추상 상황에 맞는 클래스를 사용해야합니다 :

변경하려면 XML 파서 방법의 매개 변수 유형 :

private String getEventsFromAnXML(Context ctx) 
{ 

    .... 
    Resources res = ctx.getResources(); 
    .... 

} 

을 그리고 다음과 같은 활동에서 호출 :

public void onCreate(Bundle savedInstanceState) 
{ 

    ..... 
    ctx = this.getApplicationContext(); 
    stringXmlContent = getEventsFromAnXML(ctx); 
    ..... 

} 

희망 작품입니다!

1

일반적으로 원하는 IDE는 "Refactorings"을 수행 할 수 있습니다.이 IDE를 사용하면 메소드를 다른 클래스로 이동하여 사용할 수 있습니다.

그리고 예, 다른 클래스로 메소드를 추출하는 것은 매우 일반적입니다.

관련 문제