2013-07-16 3 views
-1

У меня есть пользовательский вид, расширяющий RelativeLayout (может быть любая другая группа представлений). В этом представлении у меня есть несколько framelayouts, добавленных с addView(). Для этого представления XML не существует! Конструктор представлений добавляет все из кода. Я хочу использовать это пользовательское представление как любое другое представление контента для активности. У меня есть этот фрагмент деятельности: MyView myview;поставка пользовательского вида для setContentView не работает?

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

     myview = new MyView(this); 
     myview.getSomeContainedFrameLayoutOfView().setId(12345); 
     setContentView(myview); 
    } 

Тогда я делаю это в onResume

@Override 
    protected void onResume() { 

    super.onResume(); 

    View u = findViewById(12345); // test, returns null 
    u = myview.findViewById(12345); // test, also null 
    SomeFragment f = new SomeFragment(); 
    FragmentManager m = getSupportFragmentManager(); 
    FragmentTransaction ft = m.beginTransaction(); 
    ft.replace(12345, f); // ofcourse error (no view found for id) 
    ft.commit(); 
    } 

Почему findViewById нуль? Если я изменю setContentView() линии до setContentView(R.layout.myframelayouts); Все работает. Так почему-то я подозреваю setId(12345) делает что-то отличное от: android:id="@+id/someid" Что мне не хватает?

+0

Я думаю, что XML компилируется в код в приложении, а код запускается во время выполнения. Кажется, вам не хватает компиляционного бита. –

+0

, если вы попытаетесь сделать это, я бы рекомендовал создать [Id Resource] (http://developer.android.com/guide/topics/resources/more-resources.html#Id) и использовать это как идентификатор будет создан для вас во время компиляции, тогда вы просто передадите идентификационное имя, а не число. – Eluvatar

ответ

0

Является ли представление, возвращаемое getSomeContainedFrameLayoutOfView(), фактически содержащимся в RelativeLayout? То есть, где-то в MyView вы вызывали AddView (theTargetView)?

Если целевой вид является просто элементом MyView, то RelativeLayout, который реализует findViewById, если вы его не переопределяете, не знает о целевом представлении.

0

У меня есть что-то вроде этого:

public class MojLayout extends LinearLayout { 

private FrameLayout lijeviFrame; 
private FrameLayout glavniFrame; 
private int layoutWidth; 
private int panel; 
private boolean glavniFrameFullScreen = false; 

public MojLayout(final Context context, final float leftWeight) { 
    super(context); 

    lijeviFrame = new FrameLayout(context); 
    glavniFrame = new FrameLayout(context); 

    post(new Runnable() { 
     @Override 
     public void run() { 
      layoutWidth = getWidth(); 
      panel = (int) (layoutWidth/leftWeight); 
      init(context); 
     } 
    }); 
} 

private void init(Context context) { 
    lijeviFrame.setId(R.id.lijeviFrame); //defined in /res/values/ids.xml 
    glavniFrame.setId(R.id.glavniFrame); 

    LinearLayout container = new LinearLayout(context); 
    container.setOrientation(HORIZONTAL); 
    .... 
    container.addView(lijeviFrame); 
    container.addView(glavniFrame); 

    addView(container); 
} 

В OnCreate() метод я попытался myView.findViewbyId (R.id.lijeviFrame) -> нуль, без MyView, такой же. Я не понимаю

+0

Благодарим за отправку кода. Однако это не тот же вопрос. В этом коде конструктор для вашего MojLayout отправляет запрос на вызов Init для возврата, а init фактически добавляет дочерние представления. Этот запрос будет запускаться в потоке пользовательского интерфейса, но onCreate уже работает в этом потоке, поэтому Init не будет вызываться до тех пор, пока не вернется команда onCreate. –

+0

Вы правы! Я установил onGlobalLayoutListener, и в этом слушателе я смог получить идентификаторы детей –

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