文章目錄
- 1. 如何將歡迎界面設置成全屏
- 2. AndroidManifest.xml 詳解
- 3. 使用Bundle在Activity之間交換數據
- 4.如何實現類似微信左上角的返回
- 5. ANDROID SUPPORT兼容包詳解
- 6. 安裝dryrun
- 7. Handler消息傳遞機制
- 8. Namespace 'app' not bound
- 9. 實現ListView下拉刷新的功能
- 10. 如何從fragment跳轉到Activity,之後點擊返回還能返回到這個fragment?
- 11. 如何從一個Activity轉向另一個Activity之後不能實現返回?
- 12. ActionBar中的返回箭頭與返回鍵的有區別嗎?
- 13. 在Fragment中用listview。
- 14 android虛擬器訪問tomcat服務器
- 15 java.net.SocketException: Permission denied異常
- 16 Conflict with dependency
- 17 setTag(key,Object)的設置的相關問題
- 18 ListView中有按鈕,如何響應點擊事件?
- 19 安卓虛擬器默認存放
1. 如何將歡迎界面設置成全屏
( 環境AS3.0,安卓8.0)
還有別的方法,比如在getWindow() 下邊設置 requestWindowFeature(Window.FEATURE_NO_TITLE) ,但不管用。
- 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);
}
- 修改style文件
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
- 修改 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
定期刪除,很佔用存儲空間