这里简化了我的设置: 我有一个片段,我有一个按钮。我想要做的是向用户显示该按钮的功能。我希望这个解释看起来像这样:除了按钮变暗之外的所有视图,按钮旁边有一个TextView,表示"嘿,这是一个按钮!"。
我在做什么: 1)我创建了一个DialogFragment,它复制了该按钮并在其附近有一个TextView。布局看起来像这样:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/tutorial_fragment_element"
android:layout_width="14dp"
android:layout_height="16dp"
android:layout_marginLeft="1dp"
android:text="Button"/>
<TextView
android:id="@+id/tutorial_fragment_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="The button!"/>
</LinearLayout>
</LinearLayout>
因此,tutorial_fragment_element
是我应该分配与原始按钮相同位置的元素。
这里是教程幻灯片DialogFrament的代码:
public class TutorialScreen extends DialogFragment {
/**
* View
*/
@BindView(R.id.tutorial_fragment_element) LinearLayout mTutorialElement;
/**
* Constructor
*/
public TutorialScreen3() {
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tutorial_fragment, container, false);
ButterKnife.bind(this, view);
return view;
}
@Override
protected void updateTargetPosition() {
int x = getTargetX();
int y = getTargetY();
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
layoutParams.setMargins(x,y,0,0);
mTutorialElement.setLayoutParams(layoutParams);
}
}
实际上,它继承自我的自定义DialogFragment,其中我设置了所有必要的东西,因为有很多教程屏幕。它在这里并不重要,但实际上我如何得到原始按钮的位置(不是在DialogFragment上,而是在Fragment本身上):
protected void setDialogPosition() {
if (mTargetView == null) {
return; // Leave the dialog in default position
}
Rect rect = new Rect() ;
mTargetView.getGlobalVisibleRect(rect);
int sourceX = rect.centerX()-(rect.width()/2)+mTargetView.getLeft()-2;
int sourceY = rect.centerY()-(rect.height()/2+mTargetView.getBottom())-18;
mTargetX = sourceX;
mTargetY = sourceY;
updateTargetPosition();
}
这就是交易:DialogFragment上按钮的位置总是与原始Fragment按钮的位置不同。
我的问题是:如何获得元素的绝对位置并将其传递到元素的位置到DialogFragment上,如上所示?