2013-12-17 2 views
0

Я пытаюсь централизовать свой код для обработки ящиков навигации в суперкласс, который распространяется на все действия. Сам суперкласс расширяет Activity, но я не могу понять, как получить доступ к представлению подкласса (findviewbyid возвращает null).Доступ к представлениям из суперкласса

Как получить доступ к представлениям, завышенным в CheckinActivity от CommonCode?

Superclass OnCreate:

public class CommonCode extends Activity{ 
.... 
    @Override 
public void onCreate(Bundle b){ 
super.onCreate(b); 
context=getBaseContext(); 

SubClass

public class CheckInActivity extends CommonCode { 

@Override 
public void onCreate(Bundle b) { 
    super.onCreate(b); 

    setContentView(R.layout.activity_main); 
} 

ответ

2

Что я могу сделать, это иметь раздельные XMLs для каждой подгруппы деятельности, но имеют все XML идентификаторы ваших навигационных ящиков будет то же самое.

Далее, при запуске любого подкласса расширенного действия передайте пакет с идентификатором contextView - R.layout.MY_SUB_ACTIVITY - в комплекте и фактически настройте представление содержимого для каждого вспомогательного действия из вашего суперкласса.

Впоследствии вы можете использовать findViewByID, чтобы найти свои ящики, настроить их в суперклассе, а затем просто обрабатывать представления своего подкласса из собственного класса.

Вашего мнение, вероятно, возвращается нулем, потому что ваши работает OnCreate вашего супер класса, прежде чем ваш подкласс - поэтому setContentView не был вызван (так findViewByID не будет работать)

EDIT:

Кроме того, вам не нужно указывать все идентификаторы ящика навигации одинаково - я просто думаю, что проще использовать тег <include>, чтобы минимизировать избыточность в ваших xml-файлах.

Для примера:

Подкласс -

public class InviteActivity extends MainActivity { 

public static void openActivity(Activity from_activity) { 
    Intent intent = new Intent(from_activity, InviteActivity.class); 

    Bundle bundle = new Bundle(); 
    bundle.putInt(MainActivity.KEY_LAYOUT_ID, R.layout.invite_activity); 
    bundle.putBoolean(MainActivity.KEY_HAS_LEFT_DRAWER, true); 
    bundle.putBoolean(MainActivity.KEY_HAS_RIGHT_DRAWER, false); 

    intent.putExtra(MainActivity.KEY_MAIN_BUNDLE, bundle); 
    from_activity.startActivity(intent); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     ..... 

    } 

SuperClass:

public abstract class MainActivity extends Activity { 

    /* 
    * Bundle keys specifying if the new activity inheriting from MainActivity 
    * has a left and/or right navigation drawer. 
    */ 
    public static final String KEY_MAIN_BUNDLE = "com.smashingboxes.bevii.MAIN_BUNDLE_KEY"; 
    public static final String KEY_HAS_RIGHT_DRAWER = "com.smashingboxes.bevii.HAS_RIGHT_DRAWER"; 
    public static final String KEY_HAS_LEFT_DRAWER = "com.smashingboxes.bevii.HAS_LEFT_DRAWER"; 
    public static final String KEY_LAYOUT_ID = "com.smashingboxes.bevii.LAYOUT_ID_KEY"; 
    public static final String KEY_SECTION_TITLE = "comm.smashingboxes.bevii.SECTION_TITLE"; 

    /* 
    * Boolean indicators for each activity specifying their active navigation 
    * drawers. 
    */ 
    private boolean hasRightDrawer; 
    private boolean hasLeftDrawer; 

    /* The current activity's layout id for setContentView */ 
    private String sectionTitle; 
    private int contentID; 

    /* UI Elements */ 
    private DrawerLayout mDrawerLayout; 
    private ActionBarDrawerToggle mDrawerToggle; 

    /* Reference to the ActionBar title to toggle text on drawer changes. */ 
    protected CustomTextView mTitle; 

    private ListView mDrawerListLeft; 
    private LeftNavigationAdapter leftAdapter; 
    private ListView mDrawerListRight; 
    private LeftMessagesAdapter rightAdapter; 

    /** 
    * Handles the navigation drawer set up for each class inheriting from main 
    * activity. A bundle must be specified indicating the number of navigation 
    * drawers present in the activity's UI. 
    */ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (!getIntent().hasExtra(KEY_MAIN_BUNDLE)) 
      throw new IllegalArgumentException(
        "Cannot access a subclass of MainActivity without including a main bundle."); 

     Bundle mainBundle = getIntent().getBundleExtra(KEY_MAIN_BUNDLE); 
     hasRightDrawer = mainBundle.getBoolean(KEY_HAS_RIGHT_DRAWER); 
     hasLeftDrawer = mainBundle.getBoolean(KEY_HAS_LEFT_DRAWER); 
     contentID = mainBundle.getInt(KEY_LAYOUT_ID); 
     sectionTitle = mainBundle.getString(KEY_SECTION_TITLE); 

     setContentView(contentID); 

     if (hasRightDrawer && hasLeftDrawer) { 
      handleLeftNavigationDrawer(); 
      handleRightNavigationDrawer(); 
     } else if (hasLeftDrawer) { 
      handleLeftNavigationDrawer(); 
     } 
    } 
+0

Это выглядит как хороший подход. Позвольте мне взять возиться, и я вернусь, чтобы принять это, если это сработает. – TheGeekNess

+0

Хорошо. Дайте мне знать, если это достаточно ясно - я могу предоставить пример кода, если это необходимо, но не хочу беспокоиться, если это не нужно ... – Submersed

+0

Мое единственное замешательство сейчас в том, что, поскольку Superclass oncreate вызывается перед подклассом, это означает У меня не будет времени, чтобы пройти в любой пакет до того, как будет вызван суперкласс oncreate. Поэтому я предполагаю, что мне нужно создать общедоступные методы в суперклассе и вызвать их вручную для настройки пользовательского интерфейса после запуска подкласса oncreate? – TheGeekNess

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