0

メソッドとメソッドをtextView使用して位置を取得しようとしましたが、常に 0 が返されます。onCreate() からこのメソッドを呼び出します。getTop()getLeft()

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView textView = (TextView) findViewById(R.id.hello);

    int top = textView.getLeft();
    int left = textView.getLeft();
    int height = textView.getHeight();

    Log.i("top", "top = " + top);
    Log.i("left", "left = " + left);
    Log.i("height", "height = " + height);
4

3 に答える 3

2

レイアウト パスが完了すると、レイアウト リスナーが起動します。特定のアクティビティ ライフサイクルに関連付けられていないため、レイアウト パスにオブザーバーを追加する必要があります。

    view.getViewTreeObserver().addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener()
            {
                @Override
                public void onGlobalLayout()
                {
                    // Now you may get the left/top/etc. 
                    getCoordsFromView(view);
                    // Optionally remove the listener so future layouts don't change the value
                    view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                }
            });
于 2014-06-10T19:21:18.273 に答える
2

私は答えを見つけました。getViewTreeObserver().addOnGlobalLayoutListenerこのメソッド内で getLeft、getTop などを呼び出すだけです。

于 2012-11-16T13:51:20.613 に答える
1

その時点では、テキストビューはまだ表示されていません。アクティビティのライフサイクルの後半でそれらを呼び出す必要があります(以下のドキュメントを参照)。

ライフサイクルのドキュメントを引用するには:

onCreate() の実行が完了すると、システムは onStart() メソッドと onResume() メソッドを立て続けに呼び出します。アクティビティが作成済みまたは開始済みの状態になることはありません。技術的には、onStart() が呼び出されるとアクティビティ がユーザーに表示されますが、onResume() がすぐに続き、何かが変更されるまでアクティビティは再開状態のままになります。

いくつかの画像

于 2012-11-16T09:40:04.890 に答える