2015-08-27 6 views
1

Внутри фрагмента я пытаюсь раздуть две раскладки, кроме расположения корней:Надуйте несколько макетов

View a, b; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View root = inflater.inflate(R.layout.list_fragment, container, false); 

    //.. 
    a = inflater.inflate(R.layout.empty_list_view, container); 
    b = inflater.inflate(R.layout.progress_list_view, container); 
    //.. 

    return root; 
} 

public void showB() { 
    a.setVisibility(GONE); 
    b.setVisibility(VISIBLE); 
} 

Так что я просто возвращает один макет из метода onCreateView. Однако я раздуваю еще два, a и b.

Однако при отображении b фактически отображается a. Поэтому progress_list_view никогда не появляется. Может ли кто-нибудь объяснить это странное поведение?

Я подозреваю, что a и b оба добавлены в контейнер (ViewGroup). И так как первый добавлен, он будет отображаться первым.

+0

Почему вы не раздувать новый вид в том же контейнере. – Rohit5k2

ответ

3

редактировать:

Дело в том, что вы делаете огромный беспорядок, и нет никаких причин, почему вы делаете это.

Что происходит там, что вы раздувать корень, но не прикрепить его к контейнеру с этой линией View root = inflater.inflate(R.layout.list_fragment, container, false);

Тогда вы надуть два представления и добавить их непосредственно в контейнер с этими линиями a = inflater.inflate(R.layout.empty_list_view, container);, которая является неправильной вещью сделать в соответствии фрагмент документации:

фрагмент не должен добавить сам вид, но это может быть использовано для создания LayoutParams по мнению

также как a и b являются тем же объектом, который является container объектом в соответствии с документации для LayoutInflater

Если корень подавались, это корень

и корень был поставлен вами и это container, так что у вас есть в основном так же, как a=container;b=container;

, а затем вы возвращаетесь корень, в какой момент я действительно не знаю, что больше происходит из-за этого беспорядок. Я описал.

Лаки, чтобы исправить это легко:

создать другой XML-макет, как это (укороченный):

<FrameLayout> 
    <include layout="@layout/empty_list_view"/> 
    <include layout="@layout/progress_list_view"/> 
</FrameLayout> 

тогда раздувать этот новый XML:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View root = inflater.inflate(R.layout.new_xml, container, false); 
    a = root.findViewById(.. ID of the root of empty_list_view..) 
    b = root.findViewById(.. ID of the root of progress_list_view..) 
    return root; 
} 

затем код будет работать.

оригинальный ответ:

Там нет странного поведения. Вы раздули эти макеты, и у вас есть 2 View объекты, которые являются их репрезентативными. Но ничто не привязало эти Views к пользовательскому интерфейсу.

Только вид, который вы возвращаете из onCreateView, который будет прикреплен к пользовательскому интерфейсу устройства.

Например:

следующий код покажет a:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    //.. 
    View a = inflater.inflate(R.layout.empty_list_view, container); 
    View b = inflater.inflate(R.layout.progress_list_view, container); 
    //.. 
    return a; 
} 

следующий код покажет b:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    //.. 
    View a = inflater.inflate(R.layout.empty_list_view, container); 
    View b = inflater.inflate(R.layout.progress_list_view, container); 
    //.. 
    return b; 
} 

, если вы хотите, чтобы они оба togeher вы должны поставить их вместе в файле макета XML. Возможно, используйте тег include, если вам нужно его повторно использовать.

+0

Извините, я не был четко осведомлен о своей конкретной проблеме. Я редактировал свой вопрос. –

+0

см. Отредактированный ответ. Короче говоря, вы делаете большой беспорядок на своем коде, но его легко исправить. – Budius

+0

Я не включал причину, почему мне это нужно, потому что это не входит в сферу этого вопроса. Но вы помогли мне понять проблему с контейнером. Итак, +1 ✅ –

0

Вы можете вернуть только один вид из onCreateView. Возвращаемое представление - это отображаемое представление. Похоже, вы всегда возвращаете вид a.

+0

Простите, что я не совсем понял свою проблему. Я редактировал свой вопрос. –

0

R.layout.list_fragment должен выглядеть примерно так:

<FrameLayout> 
    <include 
     android:id="@+id/a" 
     layout="@layout/empty_list_view"/> 
    <include 
     android:id="@+id/b" 
     layout="@layout/progress_list_view"/> 
</FrameLayout> 

Ваш код будет выглядеть примерно так:

View a, b; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View root = inflater.inflate(R.layout.list_fragment, container, false); 
    a = root.findViewById(R.id.a); 
    b = root.findViewById(R.id.b); 

    return root; 
} 

public void showB() { 
    a.setVisibility(GONE); 
    b.setVisibility(VISIBLE); 
} 
+0

Жаль, что я не был четко осведомлен о моей конкретной проблеме. Я редактировал свой вопрос. –

+0

Обновлен ответ для вас – JoeyJubb

0

/** Вызывается, когда активность создается впервые. */

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    LinearLayout layoutMain = new LinearLayout(this); 
    layoutMain.setOrientation(LinearLayout.HORIZONTAL); 
    setContentView(layoutMain); 
    LayoutInflater inflate = (LayoutInflater)  getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    // 1st Layout 
    RelativeLayout layoutLeft = (RelativeLayout) inflate.inflate(
     R.layout.main, null); 

    // 2nd Layout 
    RelativeLayout layoutRight = (RelativeLayout) inflate.inflate(
     R.layout.row, null); 

    RelativeLayout.LayoutParams relParam = new RelativeLayout.LayoutParams(
    RelativeLayout.LayoutParams.WRAP_CONTENT, 
    RelativeLayout.LayoutParams.WRAP_CONTENT); 
    layoutMain.addView(layoutLeft, 100, 100); 
    layoutMain.addView(layoutRight, relParam); 
} 
0

Почему бы вам не раздуть новый вид в контейнере.

Попробуйте

LayoutInflater mInflater = null; 
ViewGroup mContainer = null; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    mInflater = inflater; 
    mContainer = container; 
    View root = inflater.inflate(R.layout.list_fragment, container, false); 
    return root; 
} 

public void showB() { 
    mInflater.inflate(R.layout.progress_list_view, mContainer, false); 
} 


public void showA() { 
    mInflater.inflate(R.layout.empty_list_view, mContainer, false); 
} 
+0

Контейнер не инициализирован –

+0

См. Мое редактирование. – Rohit5k2

+0

Можете ли вы объяснить разницу с моим кодом? –

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