2013-11-07 2 views
0

Я делаю преобразование из 2 кланов, которое extends ListActivity - extend ListFragment из-за предложений кода.Кодовые переводы от активности к фрагменту

Как я знаю, Фрагмент связан с деятельностью, поэтому сначала с помощью getActivity()... следует выполнить работу по адаптации большинства методов. В других случаях я определил Activity activity_context;, и я использую это.

Во всяком случае, у меня есть некоторые функции, которые я не могу адаптировать, и мне нужна была какая-то помощь.

Первый:RecentCallsListActivity extends Fragment

public class RecentCallsListActivity extends ListFragment 
... 

private static final class QueryHandler extends AsyncQueryHandler { 
    private final WeakReference<RecentCallsListActivity> mActivity; 
    ... 

public QueryHandler(Context context) { 
     super(context.getContentResolver()); 
     mActivity = new WeakReference<RecentCallsListActivity>(
       (RecentCallsListActivity) context); //GETTING THE ERROR HERE 
    } 

ОШИБКА: не может бросить из контекста RecenCallsListActivity

public void onActivityCreated(Bundle state) { 
    super.onActivityCreated(state); 

    mQueryHandler = new QueryHandler(activity_context); 

Второй:CallDetailActivity extends Fragment

public class CallDetailActivity extends ListFragment 
... 

public boolean onKeyDown(int keyCode, KeyEvent event) { 
    switch (keyCode) { 
     case KeyEvent.KEYCODE_CALL: { 
      // Make sure phone isn't already busy before starting direct call 
      TelephonyManager tm = (TelephonyManager) 
        getActivity().getSystemService(Context.TELEPHONY_SERVICE); 
      if (tm.getCallState() == TelephonyManager.CALL_STATE_IDLE) { 
       Intent callIntent = new Intent(Intent.ACTION_CALL, 
         Uri.fromParts("tel", mNumber, null)); 
       startActivity(callIntent); 
       return true; 
      } 
     } 
    } 

    return super.onKeyDown(keyCode, event); //GETTING IT HERE 
} 

ОШИБКА: Метод OnKeyDown (интермедиат, KeyEvent) не определено для типа ListFragment

+0

Где вы звоните 'QueryHandler' и что параметр? ... как выглядящий в вашем коде, это должен быть класс, который является или расширяет 'RecentCallsActivity'. Для второй ошибки вам необходимо делегировать вызов из Activity на ваш фрагмент. – gunar

+0

@gunar. Для первого: 'QueryHandler' находится в классе« RecentCallsActivity », и я вызываю его на' onActivityCreated' таким образом 'mQueryHandler = new QueryHandler (activity_context); «Для второго: я не понимаю, что вы имеете в виду, можете ли вы сделать простой пример того, как это сделать? Я приму ваш ответ, если работает – masmic

ответ

1
  1. QueryHandler
    Во время выполнения вы предоставляете класс, который не является RecentCallsListActivity или продлить от него. Способ обработки этого заключается в определении интерфейса, который предоставляет API, который должен быть реализован родительской активностью. Если у вас есть несколько действий, которые должны реализовать этот интерфейс и иметь одну и ту же реализацию, вы можете сделать супер Activity, который реализует ваш интерфейс, и каждая ваша деятельность будет распространяться на этот суперкласс. Но если у вас есть один класс, не нужно это делать.
  2. onKeyDown обработка - как вы можете see from API, фрагмент не выставляет onKeyDown. У меня есть некоторые идеи, почему это не было реализовано, но вы можете делегировать это действие из действия в фрагмент, так что, если фрагмент отсутствует, и он не хочет consume события, вы можете вызвать super.onKeyDown активности.

Возможно, какой-то код обеспечит некоторый свет и будет полезен.

Пример класса фрагмент:

public class QueryFragment extends Fragment { 
    public static interface RecentCallsLister { 
     public void someAction(); 
    } 

    private RecentCallsLister recentCallsListener; 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     if (activity instanceof RecentCallsLister) { 
      this.recentCallsListener = (RecentCallsLister) activity; 
     } else { 
      throw new ClassCastException("Parent class does not implement RecentCallsLister"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     this.recentCallsListener = null; 
     super.onDetach(); 
    } 

    public boolean manageOnKeyDown(int keyCode, KeyEvent event) { 
     if(keyCode == KeyEvent.KEYCODE_CALL) { 
      // your specific code 
      return true; 
     } 
     return false; 
    } 
} 

Пример класса Родитель активность:

public class QueryParentActivity extends FragmentActivity implements RecentCallsLister { 
    private static final String QUERY_FRAGMENT_TAG = "QUERY_FRAGMENT_TAG"; 

    protected void addQueryFragment() { 
     QueryFragment fragment = new QueryFragment(); 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.where_do_want_to_have_me, fragment, QUERY_FRAGMENT_TAG).commit(); 
    } 

    @Override 
    public void someAction() { 

    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (queryFragmentConsumedKeyDown(keyCode, event)) { 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

    private boolean queryFragmentConsumedKeyDown(int keyCode, KeyEvent event) { 
     FragmentManager fm = getSupportFragmentManager(); 
     Fragment fragment = fm.findFragmentByTag(QUERY_FRAGMENT_TAG); 
     if (fragment != null) { 
      return ((QueryFragment) fragment).manageOnKeyDown(keyCode, event); 
     } 
     return false; 
    } 
} 

EDIT для вашего первого вопроса:
заменить QueryHandler конструктор из:

public QueryHandler(Context context) { 
    super(context.getContentResolver()); 
    mActivity = new WeakReference<RecentCallsListActivity>((RecentCallsListActivity) context); 
    } 

к:

public QueryHandler(Context context, RecentCallsListActivity fragmentInstance) { 
    super(context.getContentResolver()); 
    mActivity = new WeakReference<RecentCallsListActivity>(fragmentInstance); 
} 

Instantiate это как: mQueryHandler = new QueryHandler(activity_context, this);

+0

Спасибо за ваш ответ @gunar, я думаю, что я ошибся, определяя класс QueryHandler, он находится в классе RecentCallsListActivity. Я обновил сообщение, чтобы быть более понятным, какой метод принадлежит каждому классу. У меня недостаточно знаний, чтобы понять весь ваш ответ, я думаю, что более подробно, чем то, что мне нужно, и я высоко ценю вашу помощь, но для меня было бы более полезным, если бы вы могли отредактировать свой ответ на что-то более простое. – masmic

+0

'RecentCallsListActivity '- класс фрагмента в конце? :) – gunar

+0

RecentCallsListActivity.java - это фрагмент, CallDetailActivity.java также фрагмент, извините, я ошибся, когда говорил вам до – masmic

Смежные вопросы