2014-11-11 2 views
0

내 응용 프로그램은 일부 활동에만 탐색 드로어를 사용합니다. 각 액티비티에서 코드를 복제하는 대신 확장 된 기본 액티비티를 수정하여 탐색 서랍 코드가 한 위치에 있도록합니다. 문제는 onItemClick 메서드가 작업에 따라 달라진다는 것입니다. 예를 들어, MainActivity에서 "집"을 누르면 우리는 이미 "집"에 있기 때문에 아무것도하지 않아야합니다. ListActivity에서 "집"을 누르면 MainActivity으로 이동해야합니다.하위 클래스에서 수퍼 클래스로 정보를 전달하여 NavigationDrawer onItemClick 구현을 결정합니다.

(더 많은 정보는 내 자신의 질문에 대한 대답은 here을 참조하십시오. 사용자가 멀리 이동할 때 각 활동을 완료하고 추가 활동을 전달하여 다음 활동에 호출 활동이 무엇인지 알려줍니다.) 사용자가 장치 뒤로 버튼을 통해 반환 할 때 서랍 닫는 애니메이션을 피하기 위해 수행됩니다. 이렇게하면 활동이 다시 시작 되었기 때문에 서랍이 애니메이션없이 닫힙니다.

어떻게 할 수 있습니까? 수퍼 클래스에 필요한 정보를 얻으시겠습니까? 수퍼 클래스에 일종의 정보를 전달하기 위해 각각의 서브 클래스가 필요할 것이다. 어쩌면 각 서브 클래스가 자신을 식별하는 int를 수퍼 클래스에 전달할 수 있으며 수퍼 클래스는 해당 int를 사용하여 각 경우에 무엇을 할 것인지 결정할 수 있습니다. 나는 그것이 가능하다면 어떻게 할 지 모르겠다.

가능한 슈퍼 클래스 BaseActivity 구현 :

mDrawerList.setOnItemClickListener(new ListView.OnItemClickListener() 
{ 
    @Override 
    public void onItemClick(AdapterView parent, View view, int position, long id) 
    { 
     //passedParameter is an int that the subclass passes to the superclass to identify itself 
     switch(int passedParameter) 
     { 
      //int passed from subclass identifies it as MainActivity 
      case MAIN_ACTIVITY: 
      { 
       switch(position) 
       { 
        //HOME 
        case 0: 
         //do nothing since we're already at MainActivity/home 
        //LIST 
        case 1: 
         //go to ListActivity 
       } 
      } 
      //int passed from subclass identifies it as ListActivity 
      case LIST_ACTIVITY: 
      { 
       switch(position) 
       { 
        //HOME 
        case 0: 
         //go to MainActivity 
        //LIST 
        case 1: 
         //do nothing since we're already at ListActivity 
       } 
      } 
     } 
    } 
}); 

가 어떻게 슈퍼 클래스의 서브 클래스에서 필요한 int을 통과 할 수 있을까?

BaseActivity 추상입니다 :

public abstract class BaseActivity extends FragmentActivity 
{ 
    protected abstract Fragment createFragment(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_fragment); 

     //navigation drawer code shown above, plus more 

     if (fragment == null) 
     { 
      fragment = createFragment(); 
      fm.beginTransaction() 
        .add(R.id.fragmentContainer, fragment) 
        .commit(); 
     } 
    } 
} 

그리고 서브 클래스는이 구현해야합니다 :

public class MainActivity extends BaseActivity 
{ 
    //how to pass some parameter to BaseActivity from here? 
    @Override 
    protected Fragment createFragment() 
    { 
     return new MainFragment(); 
    } 
} 

내가 불분명 오전 알려 주시기 바랍니다. 어떤 도움을 주셔서 감사합니다. 감사!

답변

1

나는 당신이 보호 된 변수는 서브 클래스에서 사용할 수 있도록 만들 수 있습니다 onItemClick

의 구현을 결정하기 위해 슈퍼 클래스 정보 어떤 종류의를 통과, 각각의 서브 클래스가 필요합니다. superclass에서

예 :

protected boolean isLogin = false; 

그런 다음 당신이 subclass'sonItemClickisLogin의 값을 설정할 수 있습니다.

UPDATE는

당신이 classinstance of를 사용하여 superclass을 확장 알 필요가 보인다.예 :

if(this instance of MainActivity.class) 
+0

감사합니다. 서브 클래스는'onItemClick'을 구현하지 않을 것이지만, 그 코드는 수퍼 클래스에서만 호출 될 것이고 따라서 하나 이상의 클래스에서 그것을 복제 할 필요가 없다. 다른 방법으로 정보를 전달할 수 있습니까? – pez

+0

전달하려는 정보는 무엇입니까? 보호 된 변수 (또는 메서드)를 사용하는 것이 가장 좋은 방법이라고 생각합니다. –

+0

단순한 int를 전달하면 충분하다고 생각합니다. 예를 들어,'MainActivity'에는 0을,'ListActivity'에는 1을 전달합니다. 그런 다음 수퍼 클래스의 onItemClick 메서드에서 첫 번째 switch 문에서 전달 된 매개 변수를 전환하여 수행 할 작업을 결정할 수 있습니다. 내 질문을 편집 할게 – pez

0

슈퍼 클래스를 서브 클래스에서 정보를 전달하는 방법 :

superclass에서 :

public abstract class BaseActivity extends FragmentActivity 
{ 
    protected abstract int sendSubActivity(); 
    ... 
} 

subclass에서 : 답장을

public class MainActivity extends BaseActivity 
{ 
    @Override 
    protected int sendSubActivity() 
    { 
     return CallingActivityInterface.MAIN_ACTIVITY; 
    } 
    ... 
} 
관련 문제