Просмотр инфляции и пользовательских представлений - PullRequest
4 голосов
/ 10 июня 2011

У меня есть собственное представление в моем приложении, которое я рисую, используя функцию onDraw() в представлении.Также для рисования нужны данные из ACtivity.Поэтому вместо стандартного setContentView(R.layout.myview) я использую следующее -

MyView mv = new MyView(this, userData);
setContentView(mv);

Это работало, пока я не добавил textview над пользовательским представлением.Тогда я понял, что приведенный выше код не показывает textview вообще.Также onFinishInflate() никогда не вызывается.Нужно ли самому раздувать макет в этом случае?Если да, то я должен сам вызывать функцию onDraw()?

Спасибо, - P

Ответы [ 2 ]

6 голосов
/ 10 июня 2011

onFinishInflate ()

Завершение надувания представления из XML .Это называется последней фазой инфляции, после добавления всех дочерних представлений.

Когда вы создаете свое представление с помощью кода (new ...), вы не надуваете его ... с другой стороныстороны, если вы объявляете это в XML или используете что-то вроде getLayoutInflater().inflate(R.layout.your_view,null,null);, то вы накачиваете его (и onFinishInflate) будет вызываться.

Неважно, как вы это делаете, onDraw метод всегда будет вызываться;так что вам не нужно вызывать его вручную.

Кстати ... всегда неплохо сохранить свое собственное представление о XML, даже если ему нужны данные.Таким образом, у вас есть как минимум две опции:

setContentView(R.layout.your_layout);
YourCustom custom = (YourCustom)findViewById(R.id.custom);
custom.setUserData(userData);

или ... вы можете получить эти данные из пользовательского представления (не рекомендуется):

// inside your custom view...
UserData userData = Someclass.getUserData(getContext());
// etc... so that you don't have to pass it from the activity
4 голосов
/ 10 июня 2011

Здесь у вас должен быть макет, содержащий TextView и ваш MyView, а затем внутри вашей деятельности найдите свое собственное представление и передайте свои пользовательские данные. Ваш MyView может использовать это во время своего onDraw(). Возможно, что-то вроде этого:

res/layout/main.xml

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="veritcal">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello World" />
    <my.package.MyView
        android:id="@+id/myview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

src/my/package/MyView.java:

public class MyView extends View {
    UserData mUserData = null;
    public void setUserData(userData) {
        mUserData = userData;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        performCustomDrawingWithUserData(mUserData);
        super.onDraw(canvas);
    }

}

src/my/package/MyActivity.java:

public class MyActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // pass the user data into myview here.
        MyView myView = (MyView) findViewById(R.id.myview);
        myView.setUserData(userData);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...