2016-06-23 2 views
0

очень новый для android здесь! Я в основном смущен тем, как изменить высоту и ширину представления. В настоящее время у меня есть такие (фрагменты):Правильный способ изменения высоты и ширины вида Android

XML (использует относительные макеты)

<View 
    android:id="@+id/homeBackgroundTop" 
    android:layout_width="0dp" 
    android:layout_height="0dp" 
    android:layout_centerHorizontal="true" 
    android:background="@color/colorAccent" /> 

Java

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

    Display display = getWindowManager().getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    int screenWidth = size.x; 
    int screenHeight = size.y; 

    final float pixelToDp = getResources().getDisplayMetrics().density; 
    int screenHeightDp = (int) (screenHeight * pixelToDp + 0.5f); 
    int screenWidthDp = (int) (screenWidth * pixelToDp + 0.5f); 

    View view = findViewById(R.id.homeBackgroundTop); 
    view.setLayoutParams(new RelativeLayout.LayoutParams(screenWidthDp, screenHeightDp)); 

    setContentView(R.layout.activity_main); 
} 

Проблема она поднимает следовать FATAL ERROR:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setLayoutParams(android.view.ViewGroup$LayoutParams)' on a null object reference 

Нет Мой вопрос в том, как я могу правильно изменить высоту и ширину вида? Я просмотрел многие другие ответы, но никто из них, похоже, не работает для меня.

P.S. Что именно такое RelativeLayout.LayoutParams? Если я пытаюсь изменить представление, почему я должен называть макет? Почему он иногда также содержит LinearLayout? Наконец, что такое LayoutParams? Если у вас есть ссылки на любой из этих вопросов, мы будем благодарны :) Спасибо за помощь!

ответ

1

Ваш setContentView(R.layout.activity_main); не был вызван, прежде чем звонить по телефону findViewById(). Таким образом, никакое представление не может быть найдено, потому что ваши взгляды еще не были привязаны к вашей деятельности.

Положить setContentView(R.layout.activity_main); в начале onCreate или по крайней мере, прежде чем позвонить findViewById().

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ... 
} 

EDIT

Чтобы ответить на ваш P.S.RelativeLayout.LayoutParams позволяет установить основные параметры макета, такие как высота и ширина для объекта вида. Ваш конкретный вид (Button или TextView и т. Д.), Вероятно, наследуется либо из представления LinearLayout, либо из RelativeLayout. LayoutParams, по-видимому, специфичны для разных типов макета (Relative vs Linear). Я оглядываюсь за более конкретным ответом на этот вопрос для себя в данный момент. Дайте мне знать, если вы найдете что-нибудь на нем.

+0

Спасибо, только что вернулся, чтобы сделать то, о чем вы упоминали, и оно работает! :) Спасибо!! ** О да **, так что же такое «RelativeLayout.LayoutParams»? Почему я добавляю часть RelativeLayout? Разве я не добавляю параметры в 'View'? Почему это не 'View.Params'? Пожалуйста, уточните, если вы знаете! –

+0

Отредактированный мой ответ, чтобы добавить мои два цента на ваш вопрос – user3331142

+0

Хорошо спасибо. Мне просто интересно, потому что я устанавливаю Height и Width специально для 'View', который находится внутри' RelativeLayout'. Поэтому я не был точно уверен, почему я буду устанавливать параметры родителям. Если я найду что-нибудь еще, я также дам вам знать! :) –

0

Вы пытаетесь отбросить RelativeLayout, в котором указана ошибка. Вам нужен другой вид кастинга.

Btw, setContentview должно быть прямо под супер ссылкой. Это означает, что вы пытаетесь использовать элемент View из своего XML, не вызывая сначала XML.

1

Попробуйте

ViewGroup.LayoutParams params = view.getLayoutParams(); 
    params.height = screenHeightDp; 
    params.width = screenWidthDp; 
    view.setLayoutParams(params); 

Таким образом, ваш метод onCreate будет выглядеть следующим образом.

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

     setContentView(R.layout.activity_main); 

     Display display = getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     int screenWidth = size.x; 
     int screenHeight = size.y; 

     final float pixelToDp = getResources().getDisplayMetrics().density; 
     int screenHeightDp = (int) (screenHeight * pixelToDp + 0.5f); 
     int screenWidthDp = (int) (screenWidth * pixelToDp + 0.5f); 

     View view = findViewById(R.id.homeBackgroundTop); 
     ViewGroup.LayoutParams params = view.getLayoutParams(); 
     params.height = screenHeightDp; 
     params.width = screenWidthDp; 
     view.setLayoutParams(params); 

    } 

Единственное, что следует отметить здесь всегда называют setContentView(), только после вызова super.Oncreate.

Я проверил это. Пожалуйста, дайте мне знать, если это сработает для вас.

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