2013-03-18 9 views
-1

활동이로드 될 때 스크롤 뷰에 텍스트 파일 (.txt)을 표시하는 응용 프로그램을 개발 중입니다. 텍스트 파일 바로 아래에 두 개의 버튼 (playAnimation 및 playAudio)이 있습니다.이 버튼을 누르면 해당 파일 (각각 swf 및 mp3)이 재생됩니다.동일한 활동을 사용하면서 표시되는 내용 변경하기

이제는 여러 파일에 대해 작동하도록 현재 코드를 수정하고 싶습니다. (여러 가지 활동을 통해 동일한 작업을 수행 할 수 있지만 중복되거나 프로그래밍하기에 적합하지는 않습니다.) 많은 수의 텍스트 파일과 해당 애니메이션 및 오디오 파일이 있습니다. 동일한 코드를 사용하고 파일 이름 (즉, 텍스트, 애니메이션 및 오디오 파일의 파일 이름) 만 동적으로 변경하려고합니다.

내 MainActivity는 다음과 같습니다 (코드의 주석 참조). 변경이 완료되어야 함) :

public class MainActivity extends Activity 
{ 

    Button playAnimationButton,playAudioButton; 
    MediaPlayer mp; 


    Context contextObject; 
    GestureDetector gestureDetector; 

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

     ReadText readText=new ReadText(this); 
     TextView helloTxt = (TextView)findViewById(R.id.displaytext); 

     String fileName="textone"; 

     // code to be written for getting the current page name and storing it in the String fileName 
     helloTxt.setText(readText.readTxt(fileName)); 


     String audioName="pg3"; 
     //Code to be written for getting the the current audioName 
     AssetFileDescriptor afd; 
     try { 
      afd=getAssets().openFd(audioName + ".mp3"); 
      mp = new MediaPlayer(); 
      mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 
      mp.prepareAsync(); 
     } 
     catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 







     gestureDetector = new GestureDetector(this.getApplicationContext(),new MyGestureDetector()); 
     View mainview = (View) findViewById(R.id.mainView); 

     // Set the touch listener for the main view to be our custom gesture listener 
     mainview.setOnTouchListener(new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       if (gestureDetector.onTouchEvent(event)) { 
        return false; 
       } 
       return true; 
      } 
     }); 


     playAnimationButton=(Button)findViewById(R.id.playanimation); 
     playAnimationButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       mp.pause(); 
       Intent startAnimation=new Intent(MainActivity.this,PlayAnimationActivity.class); 
       startAnimation.putExtra("SWF_NAME","a"); 

       // code for sending the particular animation file corresponding to the current page 
       startActivity(startAnimation); 
      } 
     }); 





     playAudioButton=(Button)findViewById(R.id.playaudio); 
     playAudioButton.setOnClickListener(new OnClickListener() { 


      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       //code for dynamically sending the particular audio file associated with the current page 

       if(mp.isPlaying()) 
       { 
        mp.pause(); 
       } 

       else 
       { 

        mp.start(); 
       } 


      } 
     }); 


    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 


    public class MyGestureDetector extends SimpleOnGestureListener 
    { 


     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 


      if (Math.abs(e1.getY() - e2.getY()) > GlobalVariables.SWIPE_MAX_OFF_PATH) { 
       return false; 
      } 

      // right to left swipe 
      if(e1.getX() - e2.getX() > GlobalVariables.SWIPE_MIN_DISTANCE && Math.abs(velocityX) > GlobalVariables.SWIPE_THRESHOLD_VELOCITY) { 

       // The Code for loading the next text file with its corresponding audio and animation on buttons. 

       // left to right swipe 
      } else if (e2.getX() - e1.getX() > GlobalVariables.SWIPE_MIN_DISTANCE && Math.abs(velocityX) > GlobalVariables.SWIPE_THRESHOLD_VELOCITY) { 


       // The code for loading the previous text file with its corresponding audio and animation buttons. 

      } 

      return false; 
     } 


     @Override 
     public boolean onDown(MotionEvent e) { 
      return true; 
     } 



    } 

} 

이 작업을 어떻게 진행할 수 있는지에 대한 제안 사항은 매우 만족 스럽습니다.

미리 감사드립니다. (누군가가 질문에 투표했습니다. 그럴 이유는 분명합니다.)

+1

파일 이름을 전달하고 그것을 역동적으로 팽창시킬 수있는 방법을 작성하십시오. – Abx

+0

@Abhilash 답장을 보내 주셔서 감사합니다. 나는 그것을 할 수 있었지만 나는 많은 파일을 가지고있다. 그리고 내가 다시 스 와이프하면 어떻게 마지막 텍스트의 상태를 저장하고 해당 swf 및 .mp3를 다시로드 할 수 있습니다. –

답변

1

나는 마침내 그것을 할 길을 찾았습니다. 필자의 경우이 코드가 작동합니다. 카운트 번호에 따라 파일의 이름을 유지하는 클래스가 있습니다. 파일 이름은 카운트에 따라 아래 메소드로 동적으로 전송됩니다. 아래의 메서드는 해당 파일을 동적으로 읽고 문자열을 반환하고 스 와이프의 TextView으로 설정합니다. 왼쪽 및 오른쪽으로 스 와이프하고 각각 카운트를 증가 및 감소시킵니다. 유사한 코드가 애니메이션 및 사운드 파일에 대해 유지됩니다. 이것은 원활하게 작동합니다.

public String readTxt(String fileName) 
     { 


      try { 
       InputStream is; 
       is = context.getAssets().open(fileName + ".txt"); 
       ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 

       int i; 
       i = is.read(); 
       while (i != -1) 
       { 
        byteArrayOutputStream.write(i); 
        i = is.read(); 
       } 

       is.close(); 

       return byteArrayOutputStream.toString(); 

      } 

      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 

      return fileName; 
     } 

더 효율적이고 효율적인 솔루션을 사용해보십시오. 지금은이 대답을 수락하고 있습니다. 답장을 보내 주셔서 감사합니다.

1

ListView를 사용하여 모든 파일 이름을 나열하고 onItemclick 수신기를 시작하십시오. Override onItemclick에서 파일 이름을 배열 위치와 함께 목록에서 가져올 수 있습니다. 아래 참조 ListView 코드 http://www.vogella.com/articles/AndroidListView/article.html

+0

@Senthil 답장을 보내 주셔서 감사합니다. 공유 한 웹 페이지를 사용할 수 없습니다. 그러나 나는 그것을하려고 노력할 것이다. 감사. –

+0

@abhi_is_learning_android 위의 링크를 사용해보십시오. 내 대답을 편집했습니다. –

2

활동 내에서 조각을 사용하면 동일한 조각에 많은 파일을로드 할 수 있습니다. 다음 코드 스 니펫을 확인하십시오.이 코드는 Activity의 onCreate()에 있으며 조각을로드합니다.

Fragment newFragment = new YourFragment; //Instance of your fragment 
FragmentTransaction ft = getSupportFragmentManager() 
       .beginTransaction(); 
ft.add(R.id.fragment_container, newFragment).commit(); 

다음 코드는 새 조각을로드하는 데 사용됩니다. 조각을 추가하여 스택에 추가하십시오.

void addFragmentToStack(String url) { 

    mFragmentUrl = url; 
    // Instantiate a new fragment. 
    Fragment newFragment = new your fagment; 
    // Add the fragment to the activity, pushing this transaction 
    // on to the back stack. 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.fragment_container, newFragment); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.addToBackStack(null); 
    ft.commit(); 

}