2013-07-04 43 views
0

我是android开发新手,所以我需要你的帮助。我在互联网上搜索了所有,但找不到解决方案,所以最后我决定在这里发布... 因为我是一个新手,请给我更多的信息,你可以。如何让用户编辑按钮的应用程序链接?

下面是我在做什么...

我上的活动测试,几个按钮,当用户长按它会打开按钮

(MAIN_ACTIVITY)所有应用程序的列表安装

。而当用户选择一个应用程序时,它会获取相应的软件包名称并返回到测试活动。现在,当用户点击按钮时,它将打开新的应用程序(在返回测试活动之前选择该应用程序)。

在快捷方式用户应该有能力像(应用程序链接,图标,标题)动态编辑按钮。

现在,这里是我的问题是什么...

我体健实现上述但它仅适用于只有1个按钮。我的意思是其他按钮做同样的事情。这让我疯狂...... 如果你们需要xml代码,请让我知道。 在此先感谢你们。

测试活动

package com.example.test; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.View.OnLongClickListener; 
import android.widget.Button; 
import android.widget.ListView; 

public class Test extends Activity implements OnLongClickListener, 
    OnClickListener { 

final int APPLIST_REQUEST_CODE = 12345; 
final int APPLIST_REQUEST_CODE2 = 2; 

String pac, pac2; 

private ListView mListAppInfo; 
Button bBrowser, bCalculator, bExit; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.test); 

    bBrowser = (Button) findViewById(R.id.bBrowser); 
    bExit = (Button) findViewById(R.id.bExit); 
    bCalculator = (Button) findViewById(R.id.bCalculator); 

    bBrowser.setOnClickListener(this); 
    bBrowser.setOnLongClickListener(this); 

    bCalculator.setOnClickListener(this); 
    bCalculator.setOnLongClickListener(this); 

    bExit.setOnClickListener(this); 
} 

@Override 
public void onClick(View arg0) { 
    // TODO Auto-generated method stub 
    switch (arg0.getId()) { 
    case R.id.bBrowser: 
     Intent i = getPackageManager().getLaunchIntentForPackage(pac); 
     startActivity(i); 

     break; 
    case R.id.bCalculator: 
     Intent i1 = getPackageManager().getLaunchIntentForPackage(pac2); 
     startActivity(i1); 

     break; 
    case R.id.bExit: 
     finish(); 
     break; 
    } 
} 

@Override 
public boolean onLongClick(View arg0) { 
    // TODO Auto-generated method stub 
    switch (arg0.getId()) { 
    case R.id.bBrowser: 
     Intent a = new Intent("android.intent.action.APP_LIST"); 
     startActivityForResult(a, APPLIST_REQUEST_CODE); 

     break; 
    case R.id.bCalculator: 
     Intent a2 = new Intent("android.intent.action.APP_LIST"); 
     startActivityForResult(a2, APPLIST_REQUEST_CODE2); 

     break; 
    } 
    return false; 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == APPLIST_REQUEST_CODE) { 
     if (resultCode == Activity.RESULT_OK) { 
      pac = data.getStringExtra("key"); 
     } 
    } else if (requestCode == APPLIST_REQUEST_CODE2) { 
     if (resultCode == Activity.RESULT_OK) { 
      pac2 = data.getStringExtra("key"); 
     } 
    } 

} 

@Override 
public void onBackPressed() { 
    // TODO Auto-generated method stub 
    // super.onBackPressed(); 
} 
} 

主要活动

package com.example.test; 

import android.app.Activity; 
import android.content.Intent; 
import android.content.pm.ApplicationInfo; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListView; 

public class MainActivity extends Activity { 
private ListView mListAppInfo; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.layout_main); 

    mListAppInfo = (ListView) findViewById(R.id.lvApps); 
    AppInfoAdapter adapter = new AppInfoAdapter(this, 
      Utilities.getInstalledApplication(this),  getPackageManager()); 
    mListAppInfo.setAdapter(adapter); 

    mListAppInfo.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int pos, 
       long id) { 
      AppInfoAdapter appInfoAdapter = (AppInfoAdapter) parent 
        .getAdapter(); 
      ApplicationInfo appInfo = (ApplicationInfo) appInfoAdapter 
        .getItem(pos); 



      Intent a = new Intent(); 
      a.putExtra("key", appInfo.packageName); 
      setResult(Activity.RESULT_OK, a); 
      finish(); 

     } 
    }); 
} 

} 

回答

1

首先,自己的活动转变为逻辑上是错误的。阅读关于activities and resultsMainActivity服务于Test,所以Test应该开始MainActivity的结果,而MainActivity应该通过onActivityResult返回结果到Test。你在做什么,而不是为:

Test -> new MainActivity -> new Test 

虽然它应该是:

Test -> new MainActivity -> back to the old Test 

关于按钮的问题,无论是bCalculatorbBrowser做同样的,应在开始选择MainActivity包。两个按钮在onClick中完全一样,所以为什么它们应该有不同的行为?

编辑:

Test,请拨打MainActivity这样:

final int APPLIST_REQUEST_CODE = 12345; 
Intent a = new Intent("android.intent.action.APP_LIST"); 
startActivityForResult(a, APPLIST_REQUEST_CODE); 

MainActivity,返回的结果是这样的:在Test

Intent a = new Intent(); 
a.putExtra("key", appInfo.packageName); 
setResult(Activity.RESULT_OK, a); 
finish(); 

和背部,你会得到结果如下:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(requestCode == APPLIST_REQUEST_CODE) { 
     if(resultCode == Activity.RESULT_OK) { 
      String packageName = data.getStringExtra("key", ""); 
     } 
    } 
} 

编辑2:获取和显示包图标:

图标资源ID和包名称添加到结果的意图:

a.putExtra("icon", appInfo.icon); 
a.putExtra("packageName", appInfo.packageName); 

获取图标是这样的:

int iconID = data.getIntExtra("icon", -1); 
Drawable icon = getApplicationContext().getPackageManager().getResourcesForApplication(data.getStringExtra("packageName", "")).getDrawable(iconID); 
bCalculator.setBackground(icon); 
+0

首先感谢答复Jong。你的回答是有道理的, 所以我不应该使用BUNDLE来检索包名,如果我错了,请纠正我。我应该使用onActivityResult。 因此,如何在main_activity中选择应用程序时获取包名,并通过onActivityResult将结果(包名)返回给test_activity。 在你提到的链接的帮助下,我得到了这个概念,但没有完全理解要写什么。你能给我一些代码或一些教程链接的信息。 谢谢 – user2551070

+0

增加了一些例子。 – Jong

+0

Hey Jong,我在onActivityResult上得到一个错误,它说“方法getString(String,String)对于Intent类型是未定义的,我在哪里做错误了??还有什么在bBrowser&bCalculator上对click监听器所以他们可以打开不同的应用程序 – user2551070

相关问题