2013-07-07 58 views
0

我想知道如何在androids listview中調用的應用程序名稱旁添加圖標。是的,我搜索並嘗試了各種方法,據我所知,但依然未果,任何幫助表示讚賞:)將文字添加到android listview旁邊的應用程序圖標

package mobi.omegacentauri.appcontrol; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.URI; 
import java.text.DecimalFormat; 

import mobi.omegacentauri.appcontrol.R; 
import mobi.omegacentauri.appcontrol.appcontrolService.IncomingHandler; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Notification; 
import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.content.ComponentName; 
import android.content.ContentResolver; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnCancelListener; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.content.SharedPreferences; 
import android.content.pm.PackageManager.NameNotFoundException; 
import android.content.res.Configuration; 
import android.content.res.Resources; 
import android.database.DataSetObserver; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.os.Message; 
import android.os.Messenger; 
import android.os.RemoteException; 
import android.preference.PreferenceManager; 
import android.provider.Settings; 
import android.text.Html; 
import android.text.InputType; 
import android.text.method.NumberKeyListener; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.Window; 
import android.view.WindowManager; 
import android.view.WindowManager.LayoutParams; 
import android.widget.ArrayAdapter; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.CompoundButton.OnCheckedChangeListener; 
import android.widget.AdapterView; 
import android.widget.EditText; 
import android.widget.LinearLayout; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.RadioButton; 
import android.widget.RadioGroup; 
import android.widget.SeekBar; 
import android.widget.SimpleAdapter; 
import android.widget.Spinner; 
import android.widget.SpinnerAdapter; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.widget.ToggleButton; 

public class appcontrol extends Activity implements ServiceConnection { 
    public static final boolean DEBUG = true; 
    static final String MARKET = "Market"; 

    public static final DecimalFormat decimal = new DecimalFormat("0.0"); 

    private ToggleButton activeBox; 
    private boolean active; 

    private Messenger messenger = null; 

    private SharedPreferences options; 
    private NotificationManager notificationManager; 
    private boolean getOut = false; 
    public ListView appsList; 

    static final int NOTIFICATION_ID = 1; 

    public static Setting[] getSettings(Context context, SharedPreferences pref) { 
     Setting[] allSettings = new Setting[]{ 
       new FontSize(context, pref), 
       new OrientationSetting(context, pref), 
       new TimeoutSetting(context, pref), 
       new BoostSetting(context, pref), 
       new MinCPUSetting(context, pref), 
       new MaxCPUSetting(context, pref) 
     }; 

     int count = 0; 
     for (int i=0; i<allSettings.length; i++) 
      if (allSettings[i].isActive()) 
       count++; 

     Setting[] settings = new Setting[count]; 

     count = 0; 
     for (int i=0; i<allSettings.length; i++) { 
      if (allSettings[i].isActive()) 
       settings[count++] = allSettings[i]; 
     } 

     log(""+count+" settings active"); 

     return settings; 
    } 

    public static void log(String s) { 
     if (DEBUG) 
      Log.v("appcontrol", s); 
    } 

    private void message(String title, String msg) { 
     AlertDialog alertDialog = new AlertDialog.Builder(this).create(); 

     alertDialog.setTitle(title); 
     alertDialog.setMessage(Html.fromHtml(msg)); 
     alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, 
       getResources().getText(R.string.ok), 
       new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) {} }); 
     alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { 
      public void onCancel(DialogInterface dialog) {} }); 
     alertDialog.show(); 
    } 

    private void firstTime() { 
     if (! options.getBoolean(Options.PREF_FIRST_TIME, true)) 
      return; 

     SharedPreferences.Editor ed = options.edit(); 
     ed.putBoolean(Options.PREF_FIRST_TIME, false); 
     ed.commit();   

     String msg; 
     msg = "With appcontrol, you can have some different settings in different applications"; 
     message("Welcome", msg); 
    } 

    public void helpButton(View v) { 
     help(); 
    } 

    private void saveOS() { 
    } 

    private void restoreOS() { 
    } 

    void stopService() { 
     log("stop service"); 
     stopService(new Intent(this, appcontrolService.class)); 
     restoreOS(); 
    } 

    void saveSettings() { 
    } 

    void bind() { 
     log("bind"); 
     Intent i = new Intent(this, appcontrolService.class); 
     bindService(i, this, 0); 
    } 

    void restartService(boolean bind) { 
     stopService(); 
     saveSettings();  
     Intent i = new Intent(this, appcontrolService.class); 
     log("restartService:starting service"); 
     startService(i); 
     if (bind) { 
      bind(); 
     } 
    } 

    void setActive(boolean value, boolean bind) { 
     SharedPreferences.Editor ed = options.edit(); 
     ed.putBoolean(Options.PREF_ACTIVE, value); 
     ed.commit(); 
     if (value) { 
      log("setActive:restartService"); 
      restartService(bind); 
     } 
     else { 
      stopService(); 
     } 
     active = value; 
     updateNotification(); 
    } 

    public void PleaseBuy(String title, String text, final boolean exit) {  
     AlertDialog alertDialog = new AlertDialog.Builder(this).create(); 

     alertDialog.setTitle(title);   
     alertDialog.setMessage(Html.fromHtml(text)); 

     alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, 
       "Go to "+MARKET, 
      new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       market(); 
       if (exit) { 
        stopService(); 
        finish(); 
       } 
      } }); 
     alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, 
       "Not now", 
      new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       if (exit) { 
        stopService(); 
        finish(); 
       } 

      } }); 
     alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { 

      @Override 
      public void onCancel(DialogInterface dialog) { 
       if (exit) 
        finish(); 
      } 
     }); 
     alertDialog.show();    
    } 

    private void market() { 
     Intent i = new Intent(Intent.ACTION_VIEW); 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     if (MARKET.contains("Appstore")) { 
      // string split up to fool switcher.sh 
      i.setData(Uri.parse("http://www.amazon.com/gp/mas/dl/android?p=mobi.omegacentauri.Screen" +"Dim."+"Full")); 
     } 
     else if (MARKET.contains("AndroidPIT")) { 
      // string split up to fool switcher.sh 
      i.setData(Uri.parse("http://www.androidpit.com/en/android/market/apps/app/mobi.omegacentauri.Screen" +"Dim."+"Full")); 
     } 
     else { 
      // string split up to fool switcher.sh 
      i.setData(Uri.parse("market://details?id=mobi.omegacentauri.Screen" +"Dim."+"Full")); 
     } 
     startActivity(i); 
    } 

    private void changeLog() { 
     message("Changes", getAssetFile("changelog.html")); 
    } 

    private void help() { 
     message("Questions and Answers", getAssetFile(isKindle()?"kindlehelp.html":"help.html")); 
    } 

    private void versionUpdate() { 
     int versionCode; 
     try { 
      versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode; 
     } catch (NameNotFoundException e) { 
      versionCode = 0; 
     } 
     if (options.getInt(Options.PREF_LAST_VERSION, 0) != versionCode) { 
      options.edit().putInt(Options.PREF_LAST_VERSION, versionCode).commit(); 
      changeLog(); 
     } 

    } 

    private void chooseSetting(final String app) { 
     final Setting[] settings = getSettings(this, options); 

     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     final AlertDialog dialog; 
//  builder.setTitle("Choose setting"); 

     View v = View.inflate(this, R.layout.choose_setting, null); 

     ListView list = (ListView)v.findViewById(R.id.settings); 
     list.setAdapter(new ArrayAdapter<Setting>(this,android.R.layout.simple_list_item_2, 
       settings) { 
      @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
       View v;    

       if (convertView == null) { 
        v = View.inflate(appcontrol.this, android.R.layout.simple_list_item_2, null); 
       } 
       else { 
        v = convertView; 
       } 

       ((TextView)v.findViewById(android.R.id.text1)) 
        .setText(settings[position].getName()); 
       ((TextView)v.findViewById(android.R.id.text2)) 
        .setText(settings[position].describe(app)); 
       return v; 
      } 

     }); 

     builder.setView(v); 

     dialog = builder.create(); 
     dialog.show(); 

     list.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View v, int position, 
        long id) { 

       log("chose "+settings[position].name); 
       settings[position].dialog(appcontrol.this, app); 
       dialog.dismiss(); 
      }   
     }); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 

     log("onCreate"); 
     options = PreferenceManager.getDefaultSharedPreferences(this); 

     versionUpdate(); 
     firstTime(); 

     setContentView(R.layout.main); 

     notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 

     active = options.getBoolean(Options.PREF_ACTIVE, false); 

//  if (active) { 
//   restartService(true); 
//  } 
//  else { 
//   stopService(); 
//  } 

     activeBox = (ToggleButton)findViewById(R.id.active); 
     activeBox.setChecked(active); 
     activeBox.setOnCheckedChangeListener(new OnCheckedChangeListener(){ 

      @Override 
      public void onCheckedChanged(CompoundButton button, boolean value) { 
       if (value && !active) { 
        saveOS(); 
       } 
       setActive(value, true); 

       if (value) { 
        message("Important information", 
          "If you wish to uninstall or upgrade appcontrol, uncheck the 'Active' "+ 
          "button before uninstalling or upgrading, or some system resources "+ 
          "will be wasted (they can be reclaimed by rebooting your device)."); 
       } 
      }}); 

     appsList = (ListView)findViewById(R.id.apps); 

     appsList.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View v, int position, 
        long id) { 
       MyApplicationInfo info = (MyApplicationInfo) appsList.getAdapter().getItem(position); 
       chooseSetting(info.packageName);     
      }   
     }); 

    } 

    public void setNotification(Context c, NotificationManager nm, boolean active) { 
     int icon = active?R.drawable.brightnesson:R.drawable.brightnessoff; 

     if (Options.getNotify(options) == Options.NOTIFY_NEVER) 
      icon = 0; 

     Notification n = new Notification(
       icon, 
       "appcontrol", 
       System.currentTimeMillis()); 
     Intent i = new Intent(c, appcontrol.class);  
     i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     n.flags = Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT; 
     n.setLatestEventInfo(c, "appcontrol", "appcontrol is "+(active?"on":"off"), 
       PendingIntent.getActivity(c, 0, i, 0)); 
     nm.notify(NOTIFICATION_ID, n); 
     log("notify "+n.toString()); 
    } 

    private void updateNotification() { 
     updateNotification(this, options, notificationManager, active); 
    } 

    public void updateNotification(Context c, 
      SharedPreferences options, NotificationManager nm, boolean active) { 
     log("notify "+Options.getNotify(options)); 
     switch(Options.getNotify(options)) { 
     case Options.NOTIFY_AUTO: 
      if (active) 
       setNotification(c, nm, active); 
      else { 
       log("trying to cancel notification"); 
       nm.cancelAll(); 
      } 
      break; 
     case Options.NOTIFY_NEVER: 
     case Options.NOTIFY_ALWAYS: 
      setNotification(c, nm, active); 
      break; 
     } 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 

     updateNotification(); 

     if (getOut) { 
      log("getting out"); 
      return; 
     } 

     (new GetApps(this, appsList, getSettings(this, options))).execute(); 

     if (active) { 
      restartService(true); 
     } 
     else { 
      stopService(); 
     } 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 

     if (getOut) 
      return; 

     saveSettings(); 

     if (messenger != null) { 
      log("unbind"); 
      unbindService(this); 
     } 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     log("onStop"); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     log("onDestroy"); 
    } 

    private boolean largeScreen() { 
     int layout = getResources().getConfiguration().screenLayout; 
     return (layout & Configuration.SCREENLAYOUT_SIZE_MASK) == 
        Configuration.SCREENLAYOUT_SIZE_LARGE;  
    } 

    private boolean isKindle() { 
     return Build.MODEL.equalsIgnoreCase("Kindle Fire"); 
    } 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
     if (KeyEvent.KEYCODE_MENU == keyCode) { 
      onWhatToControl(null); 
      return true; 
     } 
     return super.onKeyUp(keyCode, event); 
    } 

    public void onWhatToControl(View v) { 
     startActivity(new Intent(this, Options.class)); 
    } 

    public void onOptions(View v) { 
     startActivity(new Intent(this, Options2.class)); 
    } 

    public void onOtherApps(View v) { 
     MarketDetector.launch(this); 
    } 

    public void sendMessage(int n, int arg1, int arg2) { 
     if (messenger == null) 
      return; 

     try { 
      log("message "+n+" "+arg1+" "+arg2); 
      messenger.send(Message.obtain(null, n, arg1, arg2)); 
     } catch (RemoteException e) { 
     } 
    } 

    @Override 
    public void onServiceConnected(ComponentName classname, IBinder service) { 
     log("connected"); 
     messenger = new Messenger(service); 
     try { 
      messenger.send(Message.obtain(null, IncomingHandler.MSG_RELOAD_SETTINGS, 0, 0)); 
     } catch (RemoteException e) { 
     } 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     log("disconnected"); 
//  stopService(new Intent(this, appcontrolService.class)); 
     messenger = null;  
    } 

    static private String getStreamFile(InputStream stream) { 
     BufferedReader reader; 
     try { 
      reader = new BufferedReader(new InputStreamReader(stream)); 

      String text = ""; 
      String line; 
      while (null != (line=reader.readLine())) 
       text = text + line; 
      return text; 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      return ""; 
     } 
    } 

    public String getAssetFile(String assetName) { 
     try { 
      return getStreamFile(getAssets().open(assetName)); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      return ""; 
     } 
    } 
} 

快照

enter image description here

+0

你可以發佈它應該如何看一個屏幕截圖? 「 – Raghunandan

+0

」仍然不成功「是無用的描述。請完整,準確地解釋**你在哪裏遇到問題。 – CommonsWare

+0

這裏是屏幕截圖:[link(http://tinypic.com/view.php?pic=wi3604&s=5) 抱歉的描述,我的意思是,它沒有出現,圖標。 – Aashir

回答

1

的圖標並沒有顯示出來,因爲你的ListView行不不包含ImageView或其他任何代表圖標的內容。

因此,設計自己的行佈局,其中包含一個ImageView什麼的。創建ArrayAdapter時,請使用該行佈局替換android.R.layout.simple_list_item_2。然後,在getView()中,填入那個ImageView

Here is a sample project顯示在ListView行中放置圖標。該行包含一個ImageView

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 

    <ImageView 
     android:id="@+id/icon" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
     android:padding="2dip" 
     android:src="@drawable/ok" 
     android:contentDescription="@string/icon"/> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

     <TextView 
      android:id="@+id/label" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="25sp" 
      android:textStyle="bold"/> 

     <TextView 
      android:id="@+id/size" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="15sp"/> 
    </LinearLayout> 

</LinearLayout> 

ArrayAdapter使用該行:

class IconicAdapter extends ArrayAdapter<String> { 
    IconicAdapter() { 
     super(DynamicDemo.this, R.layout.row, R.id.label, items); 
    } 

    @Override 
    public View getView(int position, View convertView, 
         ViewGroup parent) { 
     View row=super.getView(position, convertView, parent); 
     ImageView icon=(ImageView)row.findViewById(R.id.icon); 

     if (items[position].length()>4) { 
     icon.setImageResource(R.drawable.delete); 
     } 
     else { 
     icon.setImageResource(R.drawable.ok); 
     } 

     TextView size=(TextView)row.findViewById(R.id.size); 

     size.setText(String.format(getString(R.string.size_template), items[position].length())); 

     return(row); 
    } 
} 
+0

他可以不使用複合textview嗎?只是我的想法 – Raghunandan

+0

@Raghunandan:我不知道。他現有的佈局包含兩個「TextView」小部件。我不知道OP期望這個圖標看起來像什麼,相對於其他小部件。在技​​術上可以使用帶TextView的複合drawable,但不管這是否是所需的外觀和感覺,我不能說。 – CommonsWare

+0

agree.i沒有注意到op有兩個textview小部件。 – Raghunandan

相關問題