首页 > 解决方案 > Android:在 ViewFlipper 内的按钮上执行单击()?

问题描述

我有一个在 Fragment onDismiss() 之后调用的 Activity 方法“finishCardUpdateAndClose()”。在该方法中,我试图模拟单击 Activity UI 上的按钮。该按钮是 ViewFlipper 的一个元素。我尝试使用“getCurrentView()”为 ViewTreeObserver 设置一个视图,该视图引用的是 ViewFlipper 中的按钮。这可能是我的问题。

没有点击发生。但是 ViewTreeObserver 代码之前的 Toast 和之后的 Toast 正在触发,因此看起来好像在 Fragment 关闭后调用了“finishCardUpdateAndClose()”。onGlobaLayout() 中的 ViewTreeObserver 代码中的 Toast 未触发。我还尝试只使用带有按钮的 performClick(),我还尝试使用 OnClickListener,但没有成功。

我在这里尝试在 ViewFlipper 的按钮子按钮上执行 Click() 时缺少什么?

活动代码

private View saveButtonEdits;

protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_edit); 

    viewFlipper = findViewById(R.id.viewFlipper1);
    *saveButtonEdits = viewFlipper.getCurrentView().findViewById(R.id.saveButtonRVEdits);*
}

@Override
public void finishCardUpdateAndClose() {

    Toast.makeText(AddorUpdateCardActivity.this,"finishCardUpdateAndClose run after Frag",Toast.LENGTH_LONG).show();

    ViewTreeObserver vto = saveButtonEdits.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {                
            saveButtonEdits.performClick();
            vto.removeOnGlobalLayoutListener(this);
            Toast.makeText(AddorUpdateCardActivity.this,"performClick",Toast.LENGTH_LONG).show();
        }
    });
    Toast.makeText(AddorUpdateCardActivity.this,"post-performClick!",Toast.LENGTH_LONG).show();
}

活动编辑.xml

...
<ViewFlipper
    android:id="@+id/viewFlipper1"
    android:layout_width="wrap_content"
    android:layout_height="44dp"
    android:layout_marginBottom="5dp"  >

    <include layout="@layout/cardview_nobuttons"
        android:id="@+id/cardviewNobuttons"  />

    <include layout="@layout/cardview_twobuttonsedits"
        android:id="@+id/cardviewTwobuttonsEdits" />
     ...
</ViewFlipper>

cardview_twobuttonsedits.xml

...    
<Button
    *android:id="@+id/saveButtonRVEdits"*
    android:text="Save"
    android:onClick="onClickSaveEdits"  />

分段

public void onDismiss(final DialogInterface dialog) {
    super.onDismiss(dialog);        
    if(getActivity() !=null) {
        viewFlipper.setDisplayedChild(viewFlipper.indexOfChild(getActivity().findViewById(R.id.cardviewTwobuttonsEdits)));
        mListener.finishCardUpdateAndClose();
    }
}

标签: androidviewviewflipperandroid-viewtreeobserver

解决方案


您不应该再使用 findViewById 了。使用数据绑定或视图绑定更快,将解决您的问题。


推荐阅读