安卓開發-瑣記

1. 如何將歡迎界面設置成全屏

( 環境AS3.0,安卓8.0)
還有別的方法,比如在getWindow() 下邊設置 requestWindowFeature(Window.FEATURE_NO_TITLE) ,但不管用。

  1. Activity中代碼
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //隱藏標題欄以及狀態欄,必須寫在setContentView之前
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_welcome);
        handler.sendEmptyMessageDelayed(0,2000);
    }
  1. 修改style文件
    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
 </style>
  1. 修改 AndroidManifest.xml
<activity android:name=".WelcomeActivity"
            android:noHistory="true"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>

2. AndroidManifest.xml 詳解

AndroidManifest.xml 清單文件是每個 Android 項目所必須的,它是整個 Android 應用的全局描述文件。清單文件說明了該應用的名稱、所使用的圖標以及包含的組件等。

通常包含以下信息:

1.應用程序的包名,該包名將會作爲該應用的唯一標識。
2.應用所包含的組件,如Activity、Service、BroadcastRwceiver和ContentProvider等。
3.應用兼容的最低版本。
4.應用程序使用系統所需的權限聲明。
5.其他程序訪問該程序所需的權限聲明。

3. 使用Bundle在Activity之間交換數據

當一個Activity啓動另一個Activity時,常常會有一些數據需要傳遞過去——就像Web應用從一個Servlet跳到另一個Servlet時,習慣把需要交換的數據放入requestScope、sessionScope中。對於Activity而言,在Activity之間進行數據交換更簡單,因爲兩個Activity之間本來就有一個“信使”:Intent,因此我們主要將需要交換的數據放入Intent中即可。

Intent提供了多個重載的方法來“攜帶”額外的數據,如下所示。
1.putExtras(Bundle data):向Intent中放入需要“攜帶”的數據包。
2.Bundle getExtras():取出數據包。
3.putExtra(String name,Xxx value):向Intent中按Key-Value對的形式存入數據。
4.getXxxExtra(String name):從Intent中按Key取出指定類型的數據。

Bundle包含多個方法存\取數據。
1.putXxx(String name,Xxx data):向Bundle中放入Int、Long等各種類型的數據。
2.putSerializable(String Key, Serializable data):向Bundle中放入一個可序列化的對象。
3.getXxx(String name):從Bundle中取出Int、Long等各種類型的數據。
4.getSerializable(String name, Serializable data):從Bundle中取出一個序列化對象。

注意:
Intent的putExtra(Sting name, Xxx Value)方法是“智能”的,當程序調用Intent的putExtra(String name, Xxx Value)方法向Intent存數據時,如果該Intent中已經攜帶了Bundle對象,則該方法直接向Intent所攜帶的Bundle中存入數據;如果沒有攜帶Bundle對象,則putExtra(String name, Xxx Value)方法先創建一個Bundle,再向Bundle中存入數據。
// 第一個Activity
Person p = new Person();
Bundle data = new Bundle();
data.putSerializable("person",p);
Intent intent = new Intent(thisActivity.this,targetActivity.class);
intent.putxtras(data);
startActivity(intent);
// 第二個Activity
Intent intent = getIntent();
Person p = (Person)intent.getSerializable("person");

4.如何實現類似微信左上角的返回

想要實現這一功能。需要在主清單文件中通過設置android:parentActivityName 屬性,去聲明你當前交互界面的上一級交互界面。

例子:
   <activity  
        android:name=".MainActivity"  
        android:label="@string/main_name"  
        android:theme="@style/Theme.AppCompat.Light.NoActionBar">  
        <intent-filter>  
            <action android:name="android.intent.action.MAIN" />  

            <category android:name="android.intent.category.LAUNCHER" />  
        </intent-filter>  
    </activity>  
    <activity android:name=".Main2Activity"  
        android:parentActivityName=".MainActivity">  
        <meta-data  
            android:name="android.support.PARENT_ACTIVITY"  
            android:value=".MainActivity">  
        </meta-data>  
    </activity>  
    
只用在配置文件設置即可。

5. ANDROID SUPPORT兼容包詳解

版權聲明:本文爲 stormzhang 原創文章,可以隨意轉載,但必須在明確位置註明出處!!!轉自:http://stormzhang.com/android/2015/03/29/android-support-library/

背景

來自於知乎上邀請回答的一個問題Android中AppCompat和Holo的一個問題?, 看來很多人還是對這些兼容包搞不清楚,那麼幹脆寫篇博客吧.

Support Library

我們都知道Android一些SDK比較分裂,爲此google官方提供了Android Support Library package 系列的包來保證高版本sdk開發的向下兼容性, 所以你可能經常看到v4,v7,v13這些數字,首先我們就來理清楚這些數字的含義,以及它們之間的區別。

  • support-v4

用在API lever 4(即Android 1.6)或者更高版本之上。它包含了相對更多的內容,而且用的更爲廣泛,例如:Fragment,NotificationCompat,LoadBroadcastManager,ViewPager,PageTabStrip,Loader,FileProvider 等

Gradle引用方法:

compile 'com.android.support:support-v4:21.  0.3'
  • support-v7

這個包是爲了考慮API level 7(即Android 2.1)及以上版本而設計的,但是v7是要依賴v4這個包的,v7支持了Action Bar以及一些Theme的兼容。

Gradle引用方法:

compile 'com.android.support:appcompat-v7:21.0.3'
  • support-v13

這個包的設計是爲了API level 13(即Android 3.2)及更高版本的,一般我們都不常用,平板開發中能用到,這裏就不過多介紹了。

Theme

回到知乎上的這個問題,我們來介紹下各種Theme的概念。

  • Hoho Theme

在4.0之前Android可以說是沒有設計可言的,在4.0之後推出了Android Design,從此Android在設計上有了很大的改善,而在程序實現上相應的就是Holo風格,所以你看到有類似 Theme.Holo.Light、 Theme.Holo.Light.DarkActionBar 就是4.0的設計風格,但是爲了讓4.0之前的版本也能有這種風格怎麼辦呢?這個時候就不得不引用v7包了,所以對應的就有 Theme.AppCompat.Light、 Theme.AppCompat.Light.DarkActionBar,如果你的程序最小支持的版本是4.0,那麼可以不用考慮v7的兼容。

  • Material Design Theme

今年的5.0版本,Android推出了Material Design的概念,這是在設計上Android的又一大突破。對應的程序實現上就有 Theme.Material.Light、 Theme.Material.Light.DarkActionBar等,但是這種風格只能應用在在5.0版本的手機,如果在5.0之前應用Material Design該怎麼辦呢?同樣的引用appcompat-v7包,這個時候的Theme.AppCompat.Light、 Theme.AppCompat.Light.DarkActionBar就是相對應兼容的Material Design的Theme。

注意事項

  • gradle引用appcompat-v7包的時候就不需要引用v4了,因爲v7裏默認包含了v4包;

  • compile ‘com.android.support:appcompat-v7:21.0.3’ 中的21代表API level 21推出的兼容包,所以如果你引用的是21之前的版本,則默認這些Theme.AppCompat.Light是Holo風格的,從21開始的版本默認是Material風格

  • 使用appcompat之後,你的所有的Activity應該繼承自ActionBarActivity,而ActionBarActivity繼承自FragmentActivity,所以放心的使用Fragment;

如果英語好的,可直接移步官方最權威的解釋https://developer.android.com/tools/support-library/features.html

補充:
Activity 發展到3.0(大概)之後,可以使用fragment了,但是support v4 提供了1.6~3.0的fragment兼容,所以如果需要用兼容版的fragment,則需要繼承support v4提供的FragmentActivity。而後一點點時間之後,3.0(大概)出現的ActionBar也被向前支持了,這次是出現在support v7裏,如果需要使用兼容版的actionbar,則繼承support v7提供的ActionBarActivity(它是繼承FragmentActivity的)。再然後也就是去年年底到今年,5.0提供了很多很多新東西,於是support v7也更新了,出現了AppCompatActivity , 具體功能請自行查找。

6. 安裝dryrun

簡介:用於直接把git上的android studio項目直接運行在啓動的虛擬機上,省去下載包、同步gradle、調試步驟——幹運行。簡單、暴力。

  • 安裝ruby-devkit包,不用分開安裝,省事。

  • 控制檯gem install dryrun
    如果報錯如下:

    invalid gem: package is corrupt, exception while verifying: undefined method `size’ for nil:NilClass (NoMethodError)

    解決方法:

   # gem env
   得到gem的PATH路徑,比如

  - GEM PATHS:
     - /usr/local/ruby/lib/ruby/gems/2.1.0
     - /home/vagrant/.gem/ruby/2.1.0

將其下的cache目錄刪除,再次執行gem安裝的時候就不會出錯了
  • 打開虛擬器。在命令行輸入 dryrun -項目git地址 即可。

不過最後一步報錯,不知道爲什麼。

7. Handler消息傳遞機制

前言

在安卓系統中,只允許UI線程修改Activity裏面的組件。

當程序第一次啓動時,Android會同時啓動一條主線程(Main Thread),主線程主要負責處理與UI相關的事件,如用戶的按鍵事件、用戶接觸屏幕的事件及屏幕繪圖事件,並把相關的事件分發到對應的組件進行處理。所以,主線程同城又稱爲UI線程。

Android的消息傳遞機制是另一種形式的“事件處理”,這種機制主要是爲了解決Android應用的多線程問題——Android平臺只允許UI線程修改Activity裏的UI組件,這樣就會導致新啓動的線程無法動態改變界面組件的屬性值。但在實際的開發中,尤其是動畫的遊戲開發中,需要讓新啓動的線程週期性的改變界面組件的屬性值,這就需要藉助於Handler的消息傳遞機制來實現了。

Handler類簡介

handler類的作用主要有兩個:

  • 在新啓動的線程中發送消息。
  • 在主線程中獲取、處理消息。
  • 只能接收處理自己發送的消息。

上面的說法看似很簡單,只要分兩步即可:在新啓動的線程中發送消息;然後再主線程中去獲取並處理消息。但這個過程涉及兩個問題:新啓動的線程何時發送消息呢?主線程何時去獲取處理消息呢?這個時機顯然不好控制。

爲了讓主線程能“適時”的處理新啓動的線程所發送的消息,顯然只能通過回調的方式來實現——開發者只要重寫Handler類中處理消息的方法,當新啓動的線程發送消息時,消息會發送到與之相聯的MessageQueue,而Handler會不斷的從MessageQueue中獲取並處理消息——這將會導致Handler類中處理消息的方法被回調。

Handler類包含如下方法用於發送、處理消息。

  • void handleMessage(Message msg):處理消息的方法。該方法通常用於被重寫。
  • final boolean hasMessages(int what):檢查消息隊列中是否包含what屬性爲制定值的消息。
  • fianl boolean hasMassages(int what, Object obj):檢查消息列中是否包含what屬性爲指定值且obj屬性爲指定對象的消息。
  • 多個重載的Message obtainMessage():獲取消息。
  • sendEmptyMessage(int what):發送空消息。
  • final boolean sendEmptyMessageDelayed(int what, long delayMillis):指定多少毫秒之後發送空消息。
  • final boolean sendMessage(Message msg):立即發送消息。
  • fianl boolean sendMessageDelayed(Message msg, long delayMillis):指定多少毫秒之後發送消息。

自動播放圖片示例代碼:

public class MainActivity extends Activity
{
	// 定義週期性顯示的圖片的ID
	int[] imageIds = new int[]
		{
			R.drawable.java,
			R.drawable.javaee,
			R.drawable.ajax,
			R.drawable.android,
			R.drawable.swift
		};
	int currentImageId = 0;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		final ImageView show = (ImageView) findViewById(R.id.show);
		final Handler myHandler = new Handler()
		{
			@Override
			public void handleMessage(Message msg)
			{
				// 如果該消息是本程序所發送的
				if (msg.what == 0x1233)
				{
					// 動態地修改所顯示的圖片
					show.setImageResource(imageIds[currentImageId++
							% imageIds.length]);
				}
			}
		};
		// 定義一個計時器,讓該計時器週期性地執行指定任務
		new Timer().schedule(new TimerTask()
		{
			@Override
			public void run()
			{
				// 發送空消息
				myHandler.sendEmptyMessage(0x1233);
			}
		}, 0, 1200);
	}
}


Handler、Loop、MessageQueue的工作原理

下面介紹一下雨handler一起工作的幾個組件。

  • Message:handler接收和處理的消息對象。
  • Looper:每個線程只能擁有一個Looper。它的Loop方法負責讀取MessageQueue中的消息,讀到消息之後就把消息交給發送該消息的Handler進行處理。
  • MessageQueue:消息隊列,它採用先進先出的方式來管理Meaagse。程序創建Looper對象時,會在它的構造器中創建MessageQueue對象。
  • Handler:它的作用有兩個——發送消息和處理消息,程序使用Handler發送消息,由Handler發送的消息必須被送到指定的MessageQueue。也就是說,如果希望Handler正常工作,必須在當前線程中有一個Looper對象。爲了保證當前線程中有Looper對象,可以分如下兩種情況處理。
  • 在主UI線程中,系統已經初始化了一個Looper對象,因此程序直接創建Handler即可,然後就可以通過Handler來發送消息、處理消息了。
  • 程序員自己啓動的子線程,必須自己創建一個Looper對象,並啓動它。創建對象調用它的prepare()方法即可。

8. Namespace ‘app’ not bound

將下句粘貼到xml頭部。

xmlns:app="http://schemas.android.com/apk/res-auto"

9. 實現ListView下拉刷新的功能

分爲以下幾個步驟:

  • 添加提示界面,即ListView的Header頭佈局
  • 監聽ListView的滾動事件,即onScrollListener()事件
  • 監聽ListView的OnTouch事件
  • 獲取最新數據

10. 如何從fragment跳轉到Activity,之後點擊返回還能返回到這個fragment?

背景:如微信,主界面是由四個fragment組成,隨意點擊其中一個fragment裏的組件就能跳轉到activity,之後還能返回到入口fragment。

  • 步驟一:在fragment中添加返回事件,並設置tabFlag用於標識,當前fragment。
 textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass(getActivity(),SetActivity.class);
                intent.putExtra("tabFlag",2);
                startActivity(intent);
            }
});
  • 步驟二:在重寫fragment所在Activity的onResume方法
 @Override
    protected void onResume() {
        int id = getIntent().getIntExtra("tabFlag",0);
        if(id==2){
            //設置爲當前頁面
            viewPagerIndicator.setViewPager(viewPager,2);
        }
        super.onResume();
    }

11. 如何從一個Activity轉向另一個Activity之後不能實現返回?

前提:一個Activity有很多事件,只是其中一個事件跳轉後不能返回,其他還可以。就比如:設置裏面一般有退出賬號,點擊退出之後就不能再反回之前activity了。

  • 方式一:

在startActivity(intent)之後,添加finish();

缺陷:是不能返回入口Activity,但會返回到入口Activity的上一層Activity。

  • 方式二:

添加返回事件

 private long exitTime = 0;
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode==KeyEvent.KEYCODE_BACK && event.getAction()==KeyEvent.ACTION_DOWN){
            if(System.currentTimeMillis()-exitTime>2000){
                Toast.makeText(getApplicationContext(),"再按一次退出程序",Toast.LENGTH_SHORT).show();
                exitTime = System.currentTimeMillis();
            }else{
                Intent intent = new Intent(Intent.ACTION_MAIN);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.addCategory(Intent.CATEGORY_HOME);
                startActivity(intent);
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

12. ActionBar中的返回箭頭與返回鍵的有區別嗎?

有區別。Actionbar的返回是返回上一個目錄,手機返回是返回上一個頁面。所以在微信中瀏覽公衆號內容時,如果有多個連接,那手機返回按鍵會一個一個返回,而左上角返回就直接跳到上一目錄。

13. 在Fragment中用listview。

 private String[]  names = new String[]{
      "周俊","劉帥","亮亮","坤","呂江","先進","翎姐","康哥","李瑞","老田"
    };
private ListView listView;
 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view =  inflater.inflate(R.layout.fragment_friends, container,false);
        listView = view.findViewById(R.id.friendList);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, names);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(view.getContext(),names[position]+"被點擊",Toast.LENGTH_SHORT).show();
            }
        });
        return view;
    }

自定義列表

 @Override
    public View onCreateView(LayoutInflater inflater,  ViewGroup container, Bundle savedInstanceState) {
       View view =  inflater.inflate(R.layout.fragment_chatlist,container,false);
        listView = view.findViewById(R.id.chatList);

        List<Map<String,Object>>  listItems = new ArrayList<Map<String,Object>>();
        for(int i = 0; i < names.length; i ++){
            Map<String,Object> listItem = new HashMap<String,Object>();
            listItem.put("name",names[i]);
            listItem.put("time","2018-01-11 19:22");
            listItem.put("content","Hello Hello Hello Hello");
            listItems.add(listItem);
        }
        SimpleAdapter simpleAdapter = new SimpleAdapter(getActivity(),listItems,R.layout.item_chatlist,new String[]{"name","time","content"},new int[]{R.id.name,R.id.timeDate,R.id.content});

        listView.setAdapter(simpleAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(view.getContext(),names[position]+"被點擊",Toast.LENGTH_SHORT).show();
            }
        });
        return view;
    }

14 android虛擬器訪問tomcat服務器

虛擬器應訪問ip爲10.0.2.2:8080/
可以開啓虛擬器,打開瀏覽器輸入地址進行訪問。

15 java.net.SocketException: Permission denied異常

原因是默認沒有訪問網絡所需的權限。
如果需要訪問網絡需要在AndroidManifest.xml中,進行如下配置: 
<uses-permission android:name="android.permission.INTERNET" />

16 Conflict with dependency

簡介
當我們平常運行AS編譯器,發生如下錯誤

Error:Execution failed for task ‘:app:preDebugAndroidTestBuild’. 
Conflict with dependency ‘com.android.support:support-annotations’ in project ‘:app’. Resolved versions for app (22.1.0) and test app (25.4.0) differ. See https://d.android.com/r/tools/test-apk-dependency-conflicts.html for details.

發生這類型的錯誤,是當我們修改了.build中的compileSdkVersion,產生所依賴的dependency與當前版本不一致導致的。

解決
build->Rebuid-project

17 setTag(key,Object)的設置的相關問題

定義一個 final 類型的 int 變量和硬編碼一個值的方式都是行不通的。

錯誤提示:
 java.lang.IllegalArgumentException: The key must be an application-specific resource id.  
 
 既然要求是資源Id,那就定義個ID不就行了
 如下:
    <item type="id" name="tag_0"></item>
    <item type="id" name="tag_1"></item>
    <item type="id" name="tag_2"></item>
    <item type="id" name="tag_3"></item>
有效解決問題
    viewHolder.agree.setTag(R.id.tag_0,position);
    viewHolder.agree.setTag(R.id.tag_1,viewHolder.agree);
    viewHolder.agree.setTag(R.id.tag_2,viewHolder.refuse);
    viewHolder.agree.setTag(R.id.tag_3,"1");
Tag中可以傳遞對象,對象可以是View,那就很強大了。

比如有這麼個需求:
ListView中有兩個按鈕,同意或拒絕,點擊任何一個後兩個按鈕都設置成不可點擊,並且點擊的按鈕設置成綠色。

因爲OnClick方法只能傳遞一個參數View,就是隻能傳遞一個控件。要傳遞其他信息,就要把信息封裝在View中,就是setTag()。
 public void click(View v) {
         Button agree = (Button) v.getTag(R.id.tag_1);
         Button refuse = (Button)v.getTag(R.id.tag_2);
         String flag =  (String )v.getTag(R.id.tag_3);
         Integer pos = (Integer) v.getTag(R.id.tag_0);
         if(flag.equals("0")){
             refuse.setBackgroundColor(getResources().getColor(R.color.colorGreen));
             Toast.makeText(getApplicationContext(),pos+"拒絕",Toast.LENGTH_SHORT).show();
         }else{
             agree.setBackgroundColor(getResources().getColor(R.color.colorGreen));
             Toast.makeText(getApplicationContext(),pos+"同意",Toast.LENGTH_SHORT).show();
         }
         agree.setClickable(false);
         refuse.setClickable(false);
    }

18 ListView中有按鈕,如何響應點擊事件?

設置回調函數

public class AddFriendAdapter extends ArrayAdapter<AddFriend> implements View.OnClickListener{
    private  int resourseId;
    private Callback mCallback;
    public interface Callback {
        public void click(View v);
    }
    public AddFriendAdapter(@NonNull Context context, int resource, @NonNull List<AddFriend> objects,Callback callback) {
        super(context, resource, objects);
        this.resourseId = resource;
        mCallback = callback;
        Log.d("MsgAdapter","resourseId:"+resourseId);
    }
    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

        AddFriend addFriendMsg = getItem(position);
        View view ;
        AddFriendAdapter.ViewHolder1 viewHolder;

        if(convertView == null){
            view = LayoutInflater.from(getContext()).inflate(resourseId,null);
            viewHolder = new AddFriendAdapter.ViewHolder1();
            viewHolder.toLayout = view.findViewById(R.id.apply_to_me);
            viewHolder.fromLayout = view.findViewById(R.id.apply_from_me);
            viewHolder.agree = view.findViewById(R.id.button_apply_agree);
            viewHolder.refuse = view.findViewById(R.id.button_apply_refuse);
            viewHolder.toMsg = view.findViewById(R.id.text_to_info);
            viewHolder.fromMsg = view.findViewById(R.id.text_from_info);
            view.setTag(viewHolder);
        }else{
            view = convertView;
            viewHolder = (AddFriendAdapter.ViewHolder1) view.getTag();
        }
        viewHolder.refuse.setOnClickListener(this);
        viewHolder.agree.setOnClickListener(this);
        viewHolder.agree.setTag(R.id.tag_0,position);
        viewHolder.agree.setTag(R.id.tag_1,viewHolder.agree);
        viewHolder.agree.setTag(R.id.tag_2,viewHolder.refuse);
        viewHolder.agree.setTag(R.id.tag_3,"1");
        viewHolder.refuse.setTag(R.id.tag_0,position);
        viewHolder.refuse.setTag(R.id.tag_1,viewHolder.agree);
        viewHolder.refuse.setTag(R.id.tag_2,viewHolder.refuse);
        viewHolder.refuse.setTag(R.id.tag_3,"0");


        if(addFriendMsg.getHostId() != ObjectManager.login.getId()){
            viewHolder.toLayout.setVisibility(View.VISIBLE);
            viewHolder.fromLayout.setVisibility(View.GONE);
            viewHolder.toMsg.setText(addFriendMsg.getAddInfo());
        }else{
            viewHolder.toLayout.setVisibility(View.GONE);
            viewHolder.fromLayout.setVisibility(View.VISIBLE);
            viewHolder.fromMsg.setText(addFriendMsg.getAddInfo());
        }
        return view;
    }
    class ViewHolder1{
        LinearLayout toLayout;
        LinearLayout fromLayout;
        Button agree;
        Button refuse;
        TextView toMsg;
        TextView fromMsg;
    }

    @Override
    public void onClick(View v) {
        mCallback.click(v);
    }
}


public class MsgFriendActivity extends AppCompatActivity implements AddFriendAdapter.Callback{
    private ListView listView;
    private AddFriendAdapter addFriendAdapter;
    private Button refuse;
    private Button agree;

    private Gson gson;
    private List<AddFriend> msgList = new ArrayList<AddFriend>();

   
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_msgfriend);
        listView = findViewById(R.id.list_msg_friend);

        initData();

        addFriendAdapter = new AddFriendAdapter(MsgFriendActivity.this,R.layout.item_infofriend,msgList,this);
        listView.setAdapter(addFriendAdapter);
     
    }

    private void initData(){
        gson = new Gson();
        for(int i = 1; i < 6; i ++){
            AddFriend addFriend = new AddFriend();
            addFriend.setAddId(i+7);
            addFriend.setAddInfo("小黃人+"+i);
            addFriend.setApplyTime(new Date().toString());
            addFriend.setHostId(5);
            addFriend.setStatu('0');
            msgList.add(addFriend);
        }
        for(int i = 1; i < 6; i ++){
            AddFriend addFriend = new AddFriend();
            addFriend.setAddId(i+7);
            addFriend.setAddInfo("格魯+"+i);
            addFriend.setApplyTime(new Date().toString());
            addFriend.setHostId(ObjectManager.login.getId());
            addFriend.setStatu('0');
            msgList.add(addFriend);
        }
        //msgList.addAll(ObjectManager.addMeList);
        //msgList.addAll(ObjectManager.addFriendList);
    }
    @Override
    public void click(View v) {
         Button agree = (Button) v.getTag(R.id.tag_1);
         Button refuse = (Button)v.getTag(R.id.tag_2);
         String flag =  (String )v.getTag(R.id.tag_3);
         Integer pos = (Integer) v.getTag(R.id.tag_0);
         if(flag.equals("0")){
             refuse.setBackgroundColor(getResources().getColor(R.color.colorGreen));
             Toast.makeText(getApplicationContext(),pos+"拒絕",Toast.LENGTH_SHORT).show();
         }else{
             agree.setBackgroundColor(getResources().getColor(R.color.colorGreen));
             Toast.makeText(getApplicationContext(),pos+"同意",Toast.LENGTH_SHORT).show();
         }
         agree.setClickable(false);
         refuse.setClickable(false);
    }
}

19 安卓虛擬器默認存放

c:\用戶目錄\.android\avd

定期刪除,很佔用存儲空間
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章