2012-05-11 4 views
2

안드로이드 appwidgets 및 여기에 더 많은 질문에 천 가지 다른 자습서가 있어야합니다,하지만 난 그냥 내 이유가 작동하지 않는 알아낼 수 없습니다. sigh 수사적 질문 : setOnClickListener (새 새 Button.OnClickListener() {// do stuff}를 사용하여 다른 모든 객체와 마찬가지로 코드를 여기에서 동일하게 만들 수 없습니다 ... 어쨌든 내 위젯이 표시됩니다. 화면에 표시되는 라벨은 정확하지만 위젯을 탭하면 아무 일도 일어나지 않습니다. 어떤 일이 발생할 것이라고 생각하는 모든 장소에 중단 점을 넣었지만 아무 것도 실행되지 않았습니다.안드로이드 appwidget 클릭 작동하지 않습니다

질문 1 : 위젯을 두드린 후 코드가 실행됩니까?

내 위젯은 탭되었을 때 실제로 업데이트되지 않고 단지 나머지 코드에서 일부 코드를 실행합니다. 단지 네트워킹 http 및/또는 소켓 서버를 만듭니다. 통신 ands. 또한 내 위젯은 데스크탑에 배치되기 전에 활동으로 구성됩니다. 여기

매니페스트입니다 : 여기
<receiver android:name="PhcaAppWidgetProvider" > 
    <intent-filter> 
     <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
     <action android:name="com.skipmorrow.phca.PhcaAppWidgetProvider.WIDGET_CLICKED" /> 
    </intent-filter> 
    <meta-data android:name="android.appwidget.provider" 
       android:resource="@xml/phca_widget_info" /> 
</receiver> 

위젯 구성 기 활동

private Activity act; 
    private static ListView listView; 
    private static ArrayAdapter<String> adapter; 
    private ArrayList<String> actionList; 
    private final String widgetPageName = "_widget"; 
    int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; 
    private static final String PREFS_NAME = "PHCA"; 
    private static final String PREF_PREFIX_KEY = "prefix_"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setTitle("Choose an action for this widget"); 
     actionList = GetActionList(); 
     if (!actionList.isEmpty()) { 
      listView = getListView(); 
      adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, actionList); 
      setListAdapter(adapter); 
     } 
     else { 
      // no objects on the widget page 
     } 

     // Find the widget id from the intent. 
     Intent intent = getIntent(); 
     Bundle extras = intent.getExtras(); 
     if (extras != null) { 
      mAppWidgetId = extras.getInt(
        AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 
     } 

     // If they gave us an intent without the widget id, just bail. 
     if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { 
      finish(); 
     } 
    } 

    private ArrayList<String> GetActionList() { 
     ArrayList<String> l = new ArrayList<String>(); 
     Page p = CommonActivity.GetPageNamed(getApplicationContext(), widgetPageName); 
     if (p!=null) { 
      if (p.pageObjects.size()==0) DisplayEmptyPageHelpDialog(); 
      for (int i = 0; i < p.pageObjects.size(); i++) { 
       l.add(p.pageObjects.get(i).GetParsedMajorLabel(getApplicationContext()).toString()); 
      } 
     } 
     else { 
      CreateWidgetPage(); 
      DisplayEmptyPageHelpDialog(); 
     } 
     return l; 
    } 

    private void CreateWidgetPage() { 
     Page widgetPage = new Page(getApplicationContext()); 
     widgetPage.setPageName(widgetPageName); 
     widgetPage.SetPageType("list"); 
     widgetPage.setNote("Widget Page"); 
     widgetPage.setPageTitle("Widget Page"); 
     widgetPage.setImageFilename(""); 
     widgetPage.setTransparentImageOverlayFilename(""); 
     widgetPage.InsertInstanceIntoDatabase(getApplicationContext()); 
    } 

    private void DisplayEmptyPageHelpDialog() { 
     Dialog helpDialog = new Dialog(this); 
     helpDialog.setContentView(R.layout.phca_help_dialog); 
     helpDialog.setTitle("PHCA Widget"); 
     TextView helpText = (TextView) helpDialog.findViewById(R.id.tvHelpText); 
     helpText.setText("Your _widget page is empty. Please add an action to the _widget page so it can be used in a widget."); 
     TextView subTitle = (TextView) helpDialog.findViewById(R.id.tvSubject); 
     subTitle.setText("PHCA Widget configurator"); 
     helpDialog.show(); 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     SharedPreferences.Editor prefs = getSharedPreferences(PREFS_NAME, 0).edit(); 
     prefs.putInt(PREF_PREFIX_KEY + mAppWidgetId, position); 
     prefs.commit(); 

     // Push widget update to surface with newly set prefix 
     String majorLabel = CommonActivity.GetPageObjectAtIndex(getApplicationContext(), widgetPageName, position).GetParsedMajorLabel(getApplicationContext()).toString(); 
     String minorLabel = CommonActivity.GetPageObjectAtIndex(getApplicationContext(), widgetPageName, position).GetParsedMinorLabel(getApplicationContext()).toString(); 
     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); 
     PhcaAppWidgetProvider.updateAppWidget(getApplicationContext(), appWidgetManager, 
       mAppWidgetId, majorLabel, minorLabel); 

     Intent resultValue = new Intent(); 
     resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); 
     setResult(RESULT_OK, resultValue); 
     finish(); 
    } 

입니다 그리고 여기에 내가 다른 의도를 위젯을 추가하고 제거 할 때 내 appwidget 제공

public class PhcaAppWidgetProvider extends AppWidgetProvider { 
    private static final String ACTION_CLICK = "WIDGET_CLICKED"; 
    private final String widgetPageName = "_widget"; 
    private static final String PREFS_NAME = "PHCA"; 
    private static final String PREF_PREFIX_KEY = "prefix_"; 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
      int[] appWidgetIds) { 

     // Get all ids 
     ComponentName thisWidget = new ComponentName(context, 
       PhcaAppWidgetProvider.class); 
     //int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 
     final int N = appWidgetIds.length; 
     for (int i=0; i<N; i++) { 
      int appWidgetId = appWidgetIds[i]; 

      SharedPreferences myPrefs = context.getSharedPreferences(PREFS_NAME, context.MODE_WORLD_WRITEABLE); 
      Integer objNum = myPrefs.getInt(PREF_PREFIX_KEY + appWidgetId, -1); 
      if (objNum > -1) { 
       PageAction pa = (PageAction) CommonActivity.GetPageObjectAtIndex(context, widgetPageName, objNum); 
       String majorLabel = pa.GetUnparsedMajorLabel(context).toString(); 
       String minorLabel = pa.GetUnparsedMinorLabel(context).toString(); 
       updateAppWidget(context, appWidgetManager, appWidgetId, majorLabel, minorLabel); 
      } 
     } 
    } 

    @Override 
    public void onEnabled(Context context) { 
     Log.d("Widget", "onEnabled"); 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String intentAction = intent.getAction(); 
     updateWidgetState(context, intentAction); 
     if (intentAction.equals(ACTION_CLICK)) { 
      Bundle extras = intent.getExtras(); 
      Integer appWidgetId = extras.getInt("appwidgetid"); 
      SharedPreferences myPrefs = context.getSharedPreferences(PREFS_NAME, context.MODE_WORLD_WRITEABLE); 
      Integer objNum = myPrefs.getInt(PREF_PREFIX_KEY + appWidgetId, -1); 
      if (objNum > -1) { 
       PageAction pa = (PageAction) CommonActivity.GetPageObjectAtIndex(context, widgetPageName, objNum); 
       pa.ExecuteActionFromWidgetClick(context); 
      } 
     } else { 
      super.onReceive(context, intent); 
     } 
    } 

    public static void updateWidgetState(Context paramContext, String paramString) 
    { 
     RemoteViews localRemoteViews = buildUpdate(paramContext, paramString); 
     ComponentName localComponentName = new ComponentName(paramContext, PhcaAppWidgetProvider.class); 
     AppWidgetManager.getInstance(paramContext).updateAppWidget(localComponentName, localRemoteViews); 
    } 

    private static RemoteViews buildUpdate(Context ctx, String paramString) 
    { 
     RemoteViews views = new RemoteViews(ctx.getPackageName(), R.layout.phca_appwidget); 
     views.setTextViewText(R.id.majorlabel, "majorLabel"); 
     views.setTextViewText(R.id.minorlabel, "minorLabel"); 
     Intent intent = new Intent(ctx, PhcaAppWidgetProvider.class); 
     intent.setAction(ACTION_CLICK); 
     intent.putExtra("appwidgetid", 0); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, 0, intent , 0); 
     views.setOnClickPendingIntent(R.layout.phca_appwidget, pendingIntent); 
     if(paramString.equals(ACTION_CLICK)) 
     { 
       Toast.makeText(ctx, "ACTION_CLICK", Toast.LENGTH_LONG).show(); 

     }    
     return views; 
    } 
} 

입니다 onReceive로 전달되므로 작동하지만 아무런 클릭이 발생하지 않습니다.

질문 2 : 누군가 내가 잘못했던 것을 지적 할만큼 친절 할 수 있습니까? 여기에 자습서를 꽤 따라갔습니다 : http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetProvider.html

질문 3 : 위젯의 레이아웃 xml에 android : onclick = "WidgetClicked"를 넣을 수는 있지만 WidgetClicked 방법. WidgetProvider는 논리적 인 것처럼 보였지만, 나에게도 효과가 없었습니다. XML에서이 작업을 수행 할 수있는 방법이 있습니까?

면책 조항 : 위의 코드는 문제 해결 하루 후 절반의 현재 상태입니다. 여러 시도를 한 번 반복하면됩니다.

+0

내 질문에 편집하십시오. –

+0

아직도 작동하지 않습니다. onReceive에서 토스트 라인을 추가했는데 업데이트 및 추가 및 삭제를 위해 토스트를 얻지 만 위젯을 클릭하면 아무 것도 얻지 못합니다. 그것은 위젯이 생성 될 때 클릭 리스너를 등록하는 방식이어야합니다. 오늘 네가주는 모든 도움에 감사한다, 이맘! – MrGibbage

+0

위젯 클릭을위한 실행중인 테스트 앱이 있는데 u를 원하면 –

답변

2

당신은 매니페스트로 위젯 클릭에 대한 reciver입니다을 rigister해야합니다

<receiver android:name="MyAppWidgetProvider" > 
    <intent-filter> 
     <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
     <action android:name="com.myname.myapp.MyAppWidgetProvider.ACTION_CLICK" /> 
    </intent-filter> 
    <meta-data android:name="android.appwidget.provider" 
    android:resource="@xml/my_widget_info" /> 
</receiver> 

AppWidgetProvider.java

public class MyAppWidgetProvider extends AppWidgetProvider { 
    private static final String ACTION_CLICK = "ACTION_CLICK_WIDGET"; 
    private final String widgetPageName = "_widget"; 
    private static final String PREFS_NAME = "MYAPP"; 
    private static final String PREF_PREFIX_KEY = "prefix_"; 
    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
      int[] appWidgetIds) { 

     ComponentName thisWidget = new ComponentName(context, 
       MyAppWidgetProvider.class); 
     final int N = appWidgetIds.length; 
     for (int i=0; i<N; i++) { 
      int appWidgetId = appWidgetIds[i]; 

      SharedPreferences myPrefs = 
       context.getSharedPreferences(PREFS_NAME, context.MODE_WORLD_WRITEABLE); 
      Integer objNum = myPrefs.getInt(PREF_PREFIX_KEY + appWidgetId, -1); 
      if (objNum > -1) { 
       PageAction pa = (PageAction) CommonActivity 
        .GetPageObjectAtIndex(context, widgetPageName, objNum); 
       String majorLabel = pa.GetUnparsedMajorLabel(context).toString(); 
       String minorLabel = pa.GetUnparsedMinorLabel(context).toString(); 
       updateAppWidget(context, appWidgetManager, 
        appWidgetId, majorLabel, minorLabel); 
      } 
     } 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String intentAction = intent.getAction(); 
     if (intentAction.equals(ACTION_CLICK)) { 
     updateWidgetState(paramContext, str); 
      Bundle extras = intent.getExtras(); 
      Integer appWidgetId = extras.getInt("appwidgetid"); 
      SharedPreferences myPrefs = 
      context.getSharedPreferences(PREFS_NAME, context.MODE_WORLD_WRITEABLE); 
      Integer objNum = myPrefs.getInt(PREF_PREFIX_KEY + appWidgetId, -1); 
      if (objNum > -1) { 
       PageAction pa = (PageAction) CommonActivity 
       .GetPageObjectAtIndex(context, widgetPageName, objNum); 
       pa.ExecuteActionFromWidgetClick(context); 
      } 
     } else { 
      super.onReceive(context, intent); 
     } 
    } 

public static void updateWidgetState(Context paramContext, String paramString) 
      { 
      RemoteViews localRemoteViews = buildUpdate(paramContext, paramString); 
      ComponentName localComponentName = new ComponentName(paramContext, MyAppWidgetProvider.class); 
      AppWidgetManager.getInstance(paramContext).updateAppWidget(localComponentName, localRemoteViews); 
      } 

    private static RemoteViews buildUpdate(Context ctx, String paramString) 
      { 
     RemoteViews views = 
     new RemoteViews(ctx.getPackageName(), R.layout.my_appwidget); 
     views.setTextViewText(R.id.majorlabel, majorLabel); 
     views.setTextViewText(R.id.minorlabel, minorLabel); 
     Intent intent = new Intent(ctx, MyAppWidgetProvider.class); 
     intent.setAction(ACTION_CLICK); 
     intent.putExtra("appwidgetid", mAppWidgetId); 
     PendingIntent configPendingIntentprev = PendingIntent.getBroadcast(ctx, 0, intent , 0); 
     views.setOnClickPendingIntent(R.layout.my_appwidget, pendingIntent); 
      if(parmString.equals(ACTION_CLICK)) 
      { 
      //Toast.maketext("").show(); 
      // 

      }    
      return rview; 
      } 
} 

전체 예를 들어 this 게시물에 내 대답을 참조하십시오.

+0

해결되지 않으면 bez 나 작업 예제가 –

+0

"YOUR_APPWIDGETNAME"은 어디에서 왔습니까? com.myname.myapp.MyAppWidgetProvider를 시도했지만 작동하지 않습니다. 한 번 클릭하면 어떤 코드가 실행됩니까? onReceive로 오는 모든 의도를보고 있습니다. , APPWIDGET_UPDATE 및 다른 일부와 같은,하지만 클릭 한 후 아무 것도 보지 못했습니다. 귀하의 예를 들어 그것은 들어오는 들어오는 것처럼 보이지만 그것은 나를 위해 일어나지 않습니다. – MrGibbage

+0

다른 게시물에 대한 내 대답을 확인했습니다 –

관련 문제