簡體   English   中英

更新使用FragmentGridPagerAdapter創建的自定義片段中的CircularButton

[英]Updating a CircularButton in a custom Fragment created with FragmentGridPagerAdapter

我有一個可穿戴式應用程序,它具有使用FragmentGridPagerAdapter創建的幾個片段。 其中一個片段有幾個CircularButtons,我想在從手持電話收到消息時更新按鈕的背景色。 我收到郵件沒有問題。 但是,按鈕的顏色(或UI中的任何內容)不會更新。 你知道我該怎么解決嗎?

public class UIPageAdapter extends FragmentGridPagerAdapter {
private final Context mContext;
MainControlFragment[] mainControlFragments;
private List mRows;
uiChangeListener mUIChangeListener = new uiChangeListener();


public UIPageAdapter(Context ctx, FragmentManager fm) {


    super(fm);

    Log.i("pageAdapter", "constructor");
    mContext = ctx;
    mainControlFragments = new MainControlFragment[2];
    mainControlFragments[0] = new MainControlFragment();
    mainControlFragments[1] = new MainControlFragment();
    LocalBroadcastManager.getInstance(ctx).registerReceiver(mUIChangeListener,new IntentFilter(Constants.BROADCAST_CONTROL_HOME));
}

@Override
public Fragment getFragment(int row, int col) {

Log.i("PageAdapter","Fragment #" + col +"is asked");

    return mainControlFragments[col];

}

public void changeStatus(int button, boolean status) {
    mainControlFragments[0].setStatus(button,status);

 //   notifyDataSetChanged();

}


public class uiChangeListener extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {

            String act = intent.getAction();

            if (act == Constants.BROADCAST_CONTROL_HOME) {

                int key =  intent.getIntExtra(Constants.CONTROL_HOME_KEY,-1);
                String command = intent.getStringExtra(Constants.CONTROL_HOME_COMMAND);
                changeStatus(key,command.equals("on"));
            }
    }
}


@Override
public int getRowCount() {
    return 1;
}

@Override
public int getColumnCount(int i) {
    return 2;
}

    }

基本上,當從手持設備收到消息時,WearableListener類將更新消息廣播到UIPageAdapter。這是偵聽器類

public class ListenerService extends WearableListenerService
 {

    String tag = "ListenerService";

    @Override
    public void onMessageReceived(MessageEvent messageEvent) {


            final String message = (new String(messageEvent.getData()));
        Log.i(tag,message);
        LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(Constants.BROADCAST_CONTROL_HOME)
                    .putExtra(Constants.CONTROL_HOME_KEY, messageEvent.getPath())
                    .putExtra(Constants.CONTROL_HOME_COMMAND,Integer.parseInt(message.substring(1)))
                    .putExtra("caller",tag));

        }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(tag, "onCreate");
    }

}

清單文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="smartstuff.com.tr.myautomationtool" >

    <uses-feature android:name="android.hardware.type.watch" />

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.DeviceDefault" >
        <uses-library
            android:name="com.google.android.wearable"
            android:required="false" />

        <service android:name=".ListenerService">
            <intent-filter>
                <action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
            </intent-filter>
        </service>

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.DeviceDefault.Light" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

最后是自定義片段

public class MainControlFragment extends Fragment{
  ViewGroup container;

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Log.i("controlFragment","create");
        this.container = container;
        // Inflate the layout for this fragment

        return inflater.inflate(R.layout.main_control, container, false);

    }

    public void setStatus(int button, boolean status) {
        Log.i("controlFragment",button + " "+ status);
        CircularButton[] btns = new CircularButton[4];
        btns[0] = (CircularButton) container.findViewById(R.id.cbtnFront);
        btns[1] = (CircularButton) container.findViewById(R.id.cbtnBack);
        btns[2] = (CircularButton) container.findViewById(R.id.cbtnBed);
        btns[3] = (CircularButton) container.findViewById(R.id.cbtnCoffee);
        btns[button].setColor(status?Color.BLACK:Color.RED);


    }
}

我也嘗試了notifyDataSetChanged(); UIPageAdapter中的方法,但是它僅在片段中調用onCreateView方法。 任何幫助表示贊賞

我假設您已經解決了這個問題,但是我必須在調用setColor()之后在CircularButton上添加對invalidate()的調用:

_circularButton.setColor(ContextCompat.getColor(getActivity(), buttonColor));
_circularButton.invalidate();

沒有調用使UI無效的操作僅在某些時間進行了更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM