Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 26

0
votes
answers
28 views
+10

數據綁定設置顏色

0

我嘗試使用三元運算符來更改按鈕的文本顏色。 類似的東西:這裏是xml。數據綁定設置顏色

<Button 
    android:id="@+id/actionButton" 
    android:layout_width="113dp" 
    android:layout_height="30dp" 
    android:background="@drawable/button" 
    android:backgroundTint="@{selected ? R.color.white : R.color.turquoise}" 
    android:text="@{selected ? &quot;Selected &quot; : &quot;Select &quot;}" 
    android:textColor="@{selected ? @color/white : @color/turquoise}" 
    android:onClick="@{(view) -> handler.selectClick(view)}"/> 

但顏色設置不正確。我得到一些奇怪的紫色顏色。

我試圖

<import type="com.myapp.R" /> 
android:textColor="@{selected ? R.color.white : R.color.turquoise}" 

具有相同的結果。
我應該怎麼做?

+0

你綠松石色喲檢查你設置正確的顏色代碼? –

+0

是的。顏色很好。 android:textColor =「@ color/turquoise」根據需要工作 – Shmuel

沙发
0
0

您的第一個變體應該可以正常工作。您可以參考this doc的「資源」一章。 這是一個完整的工作示例。

colors.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    ... 
    <color name="foo">#fff</color> 
    <color name="bar">#000</color> 
</resources> 

main_activity.xml

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 

    <data> 
     <variable name="selected" type="boolean" /> 
     <variable name="button2" type="String" /> 
    </data> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/btn_a" 
      android:onClick="switchColor" 
      android:text="Click me"/> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/btn_b" 
      android:textColor="@{selected ? @color/foo : @color/bar}" 
      android:text="@{button2}"/> 

    </LinearLayout> 
</layout> 

ActivityMain.class

public class ActivityMain extends AppCompatActivity { 

    public static final String TAG = "MainActivity"; 

    MainActivityBinding mBinding; 
    boolean mSelected; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mBinding = DataBindingUtil.setContentView(this, R.layout.main_activity); 
     mBinding.setButton2("Don't click me please!"); 
    } 

    public void switchColor(View view) { 
     mBinding.setSelected(mSelected = !mSelected); 
    } 
} 
0
votes
answers
33 views
+10

如何從Firebase將所有用戶檢索到片段?

-1

我創建了一個回收站鑑於我fragment_add_friends.xml像下面如何從Firebase將所有用戶檢索到片段?

<android.support.v7.widget.RecyclerView 
android:id="@+id/all_user_list" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:scrollbars="vertical" /> 

和我創建all_user_display_layout.xml文件顯示每個用戶像下面

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

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

     <de.hdodenhof.circleimageview.CircleImageView 
      android:id="@+id/all_user_image"> 

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

      <TextView 
       android:id="@+id/all_user_name" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="full name"/> 

      <TextView 
       android:id="@+id/all_user_status" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="user status"/> 

     </LinearLayout> 

    </LinearLayout> 

</LinearLayout> 

在我AddFriendsFragment.java我喜歡下面的回收觀點在我上創建視圖方法

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_add_friends, container, false); 

     all_user_list = (RecyclerView) v.findViewById(R.id.all_user_list); 
     all_user_list.setHasFixedSize(true); 
     all_user_list.setLayoutManager(new LinearLayoutManager(getActivity())); 

     return v; 
    } 

和我已經創建了一個有一個字符串名稱,狀態 形象,有干將setter和構造函數和空construcor,因爲我要檢索這些數據和XML文件那些東西是all_user_display_layout.xml

和我的數據庫引用一個輔助類像下面

databaseReference = FirebaseDatabase.getInstance().getReference().child("users"); 

和我創建onViewCreated方法如下面

@Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 


    } 

之後是什麼,我必須做的,從 fireabse獲取數據到回收鑑於事情

請幫助我即時通訊新的這些東西

database structure

+0

請分享您的數據庫結構和您要顯示的確切記錄。 –

+0

我包括具有名稱,圖像和狀態的佈局文件,並且包含我的數據庫結構Sir – HemalHerath

沙发
0
2

假設users節點是你的火力地堡數據庫根的直接子,拿到nameimagestatus,請使用如下代碼:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference usersRef = rootRef.child("users"); 
ValueEventListener eventListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     List <String> list = new ArrayList<>(); 
     for(DataSnapshot ds : dataSnapshot.getChildren()) { 
      String name = ds.child("name").getValue(String.class); 
      String image = ds.child("image").getValue(String.class); 
      String status = ds.child("status").getValue(String.class); 
      list.add(name + "/" + image + "/" + status); 
      Log.d("TAG", name + "/" + image + "/" + status); 
     } 
     Log.d("TAG", list); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) {} 
}; 
usersRef.addListenerForSingleValueEvent(eventListener); 

你的輸出將是:

Hemal/https.../Busy 
Jake Stewart/https.../Busy 
+0

是的,它的工作就像那謝謝先生我如何設置這些值到XML文件,如果你可以請幫我一下將非常感謝 – HemalHerath

+0

@HemalHerath其非常簡單的商店,在** POJO類的** Arraylist ** ** – Prem

+0

好吧,先生,我會盡力感謝您的幫助 – HemalHerath

板凳
0
1

從onCreateView

all_user_list = (RecyclerView) v.findViewById(R.id.all_user_list); 
all_user_list.setHasFixedSize(true); 
all_user_list.setLayoutManager(new LinearLayoutManager(getActivity())); 

在onViewCreated

@Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

    FirebaseRecyclerViewAdapter<<Your-Helper-Class>, ViewHolder> adapter; 
    ref = new Firebase("https://<yourapp>.firebaseio.com"); 

    RecyclerView recycler = (RecyclerView) findViewById(R.id.all_user_list); 
    recycler.setHasFixedSize(true); 
    recycler.setLayoutManager(new LinearLayoutManager(getActivity())); 

    adapter = new FirebaseRecyclerViewAdapter<<Your-Helper-Class>, ViewHolder>(<Your-Helper-Class>.class, android.R.layout.all_user_display_layout.xml, ViewHolder.class, mRef) { 
     public void populateViewHolder(ViewHolder viewHolder, <Your-Helper-Class> helper) { 
      Picasso.with(context).load(helper.getImage()).into(viewHolder.image); 
      viewHolder.name.setText(helper.getName()); 
      viewHolder.status.setText(helper.getStatus()); 
     } 
    }; 
    recycler.setAdapter(mAdapter); 
    } 



    private static class ViewHolder extends RecyclerView.ViewHolder { 
     CircleImageView image; 
     TextView name; 
     TextView status; 

     public ChatMessageViewHolder(View itemView) { 
      super(itemView); 
      image = (TextView)itemView.findViewById(android.R.id.all_user_image); 
      name = (TextView)itemView.findViewById(android.R.id.all_user_name); 
      status = (TextView) itemView.findViewById(android.R.id.all_user_status); 
     } 
    } 

刪除這些行添加以下代碼此外,在imageview的使用畢加索加載圖像。在build.gradle中添加這些行。

compile 'com.squareup.picasso:picasso:2.5.2'

+0

我不能使用像這樣recycler.setLayoutManager(新的LinearLayoutManager(this)); – HemalHerath

+0

和我沒有populateViewholder覆蓋方法只有onBindViewHolder和onCreateViewHolder – HemalHerath

+0

添加此build.gradle編譯'com.firebaseui:firebase-ui-database:3.1.0' – kunwar97

0
votes
answers
25 views
+10

加速度運動極限

0

我使用這個代碼:加速度運動極限

void Update() 
{ 
    accel = Input.acceleration.x; 
    transform.Translate (0, 0, accel); 
    transform.position = new Vector3 (Mathf.Clamp (transform.position.x,-6.9f, 6.9f), -4.96f, 18.3f); 
} 

這讓我的遊戲對象移到我想要的方式,但問題是,當我把應用我的電話,(-6.9)(6.9)上不是我屏幕的「終點」。而我無法弄清楚如何根據每個屏幕尺寸更改這些值?

+1

使用'Screen.width'和'Screen.height'並儘量避免硬編碼變量。 –

+0

感謝您的回放。你能解釋如何使用screen.width和height嗎? –

+0

我會嘗試,但是我沒有足夠的信息來幫助您在上下文中使用它。你能發佈你想要實現的圖像嗎? –

沙发
0
0

這將是一個較長的答案,所以請在這裏忍受我。

請注意,本文假設您使用正交相機 - 使用的公式不適用於透視相機。

據我所知,你的願望是保持你的對象在屏幕邊界內。 Unity中的屏幕邊界由相機尺寸和屏幕尺寸的組合決定。

float height = Camera.main.orthographicSize * 2; 

相機的正投影尺寸決定世界單位屏幕的尺寸的一半。乘以這個值將導致屏幕頂部和底部之間的世界單位數量。

要從此值獲得寬度,我們將該值乘以屏幕寬度除以屏幕高度。

float width = height * Screen.width/Screen.height; 

現在我們有我們屏幕的尺寸,但我們仍然需要保持對象在這些邊界內。

首先,我們創建一個Bounds類型的實例,我們將使用該實例確定該位置的最大值和最小值。我們使用Vector3.zero因爲我們的邊界實例的中心

Bounds bounds = new Bounds (Vector3.zero, new Vector3(width, height, 0)); 

注應該是世界的中心。這是你的物體應該能夠在裏面移動的區域的中心。

最後,根據我們得到的界限的屬性,我們限制對象的位置值。

Vector3 clampedPosition = transform.position; 
clampedPosition.x = Mathf.Clamp(clampedPosition.x, bounds.min.x, bounds.max.x); 
transform.position = clampedPosition; 

這應該確保您的對象永遠不會離開屏幕的邊界!

+0

所以感謝解釋,但現在統一給了我bounds.min.x和bounds.max.x的錯誤:'資產/腳本/控制器。cs(31,54):錯誤CS0103:當前上下文中不存在名稱'bounds' –

+0

@TodorValkov您必須將變量'bounds'保存在某個明顯的位置,可能位於控制器腳本中的私有變量中。 –

+0

哦,現在我不在。謝謝!!它正在工作。 –

0
votes
answers
35 views
+10

NativeScript - 地理位置:使用getCurrentLocation承諾函數的正確方法

0

我正在編寫一個使用nativescript-geolocation API的簡單應用程序。 函數getCurrentLocation基本上可以正常工作,但是當我移動到另一個名爲maps-module.js的文件並從文件detail.js的主線程調用它時,它返回的對象位置爲NULL。 打印後控制對象,我意識到變量returned_location是在函數完成查找位置之前返回的。 我認爲它的多線程問題,但我真的不知道如何解決它。 這是我的文件。NativeScript - 地理位置:使用getCurrentLocation承諾函數的正確方法

detail.js

var Frame = require("ui/frame"); 
var Observable = require("data/observable"); 

var MapsModel = require("../../view-models/maps-model"); 


var defaultMapInfo = new MapsModel({ 
    latitude: "10.7743332", 
    longitude: "106.6345204", 
    zoom: "0", 
    bearing: "0", 
    tilt: "0", 
    padding: "0" 
}); 

var page; 
var mapView; 

exports.pageLoaded = function(args) { 
    page = args.object; 
    var data = page.navigationContext; 
    page.bindingContext = defaultMapInfo; 
} 

exports.onBackTap = function() { 
    console.log("Back to home"); 
    var topmost = Frame.topmost(); 
    topmost.goBack(); 
} 

function onMapReady(args) { 
    mapView = args.object; 
    mapView.settings.zoomGesturesEnabled = true; 
} 

function onMarkerSelect(args) { 
    console.log("Clicked on " + args.marker.title); 
} 

function onCameraChanged(args) { 
    console.log("Camera changed: " + JSON.stringify(args.camera)); 
} 

function getCurPos(args) { 
    var returned_location = defaultMapInfo.getCurrentPosition(); // variable is returned before function finished 
    console.dir(returned_location); 
} 


exports.onMapReady = onMapReady; 
exports.onMarkerSelect = onMarkerSelect; 
exports.onCameraChanged = onCameraChanged; 
exports.getCurPos = getCurPos; 

地圖 - module.js

var Observable = require("data/observable"); 

var Geolocation = require("nativescript-geolocation"); 
var Gmap = require("nativescript-google-maps-sdk"); 

function Map(info) { 
    info = info || {}; 
    var _currentPosition; 

    var viewModel = new Observable.fromObject({ 
     latitude: info.latitude || "", 
     longitude: info.longitude || "", 
     zoom: info.zoom || "", 
     bearing: info.bearing || "", 
     tilt: info.bearing || "", 
     padding: info.padding || "", 
    }); 

    viewModel.getCurrentPosition = function() { 
     if (!Geolocation.isEnabled()) { 
      Geolocation.enableLocationRequest(); 
     } 

     if (Geolocation.isEnabled()) { 
      var location = Geolocation.getCurrentLocation({ 
       desiredAccuracy: 3, 
       updateDistance: 10, 
       maximumAge: 20000, 
       timeout: 20000 
      }) 
      .then(function(loc) { 
       if (loc) { 
        console.log("Current location is: " + loc["latitude"] + ", " + loc["longitude"]); 
        return Gmap.Position.positionFromLatLng(loc["latitude"], loc["longitude"]); 
       } 
      }, function(e){ 
       console.log("Error: " + e.message); 
      }); 

      if (location) 
       console.dir(location); 
     } 
    } 

    return viewModel; 
} 

module.exports = Map; 
沙发
0
0

由於越來越位置是一個異步的過程,你應該viewModel.getCurrentPosition返回一個承諾,會看這樣的事情,

viewModel.getCurrentPosition() { 
    return new Promise((resolve, reject) => { 
     geolocation 
      .getCurrentLocation({ 
       desiredAccuracy: enums.Accuracy.high, 
       updateDistance: 0.1, 
       maximumAge: 5000, 
       timeout: 20000 
      }) 
      .then(r => { 
       resolve(r); 
      }) 
      .catch(e => { 
       reject(e); 
      }); 
    }); 
} 

,然後當你使用它,它看起來像這樣

defaultMapInfo.getCurrentPosition() 
    .then(latlng => { 
     // do something with latlng {latitude: 12.34, longitude: 56.78} 
    }.catch(error => { 
     // couldn't get location 
    } 
} 

希望幫助:)

更新:BTW,geolocation.enableLocationRequest()也是asynchorous方法。

+0

這就是我要找的,我的代碼現在非常簡單,謝謝XD – Sea

板凳
0
0

如果溼婆普拉薩德的註腳......

「geolocation.enableLocationRequest()也是asynchorous法」

...是正確的,那麼返回的承諾通過geolocation.enableLocationRequest()必須被處理適當的代碼將會發生相當大的變化。

試試這個:

viewModel.getCurrentPosition = function(options) { 
    var settings = Object.assign({ 
     'desiredAccuracy': 3, 
     'updateDistance': 10, 
     'maximumAge': 20000, 
     'timeout': 20000 
    }, options || {}); 

    var p = Promise.resolve() // Start promise chain with a resolved native Promise. 
    .then(function() { 
     if (!Geolocation.isEnabled()) { 
      return Geolocation.enableLocationRequest(); // return a Promise 
     } else { 
      // No need to return anything here. 
      // `undefined` will suffice at next step in the chain. 
     } 
    }) 
    .then(function() { 
     if (Geolocation.isEnabled()) { 
      return Geolocation.getCurrentLocation(settings); // return a Promise 
     } else { // <<< necessary to handle case where Geolocation didn't enable. 
      throw new Error('Geolocation could not be enabled'); 
     } 
    }) 
    .then(function(loc) { 
     if (loc) { 
      console.log("Current location is: " + loc.latitude + ", " + loc.longitude); 
      return Gmap.Position.positionFromLatLng(loc.latitude, loc.longitude); 
     } else { // <<< necessary to handle case where loc was not derived. 
      throw new Error('Geolocation enabled, but failed to derive current location'); 
     } 
    }) 
    .catch(function(e) { 
     console.error(e); 
     throw e; // Rethrow the error otherwise it is considered caught and the promise chain will continue down its success path. 
     // Alternatively, return a manually-coded default `loc` object. 
    }); 

    // Now race `p` against a timeout in case enableLocationRequest() hangs. 
    return Promise.race(p, new Promise(function(resolve, reject) { 
     setTimeout(function() { 
      reject(new Error('viewModel.getCurrentPosition() timed out')); 
     }, settings.timeout); 
    })); 
} 
return viewModel; 

注:

  1. 開始與解決本地無極鏈提供了多達包裝相同的效果new Promise(...)但清潔主要是因爲意想不到的內鏈拋出保證向鏈路的錯誤路徑下發一個Error對象,而不需要try/catch/reject()。此外,在標有「返回承諾」的兩行中,我們不必關心我們是否返回承諾或價值;要麼會被原生Promise鏈吸收。

  2. 兩個else條款是爲了迎合不會自動拋出的失敗案例。

  3. Promise.race()應該不是必要的,但是可以防止報告here的問題。有可能內置的「超時」機制就足夠了。這種額外的超時機制是一種「腰帶和大括號」措施。

  4. 包含一種機制,通過傳遞options對象來覆蓋viewModel.getCurrentPosition中的硬編碼默認值。要使用默認值運行,只需致電viewModel.getCurrentPosition()即可。此功能主要是爲了允許settings.timeoutPromise.race()中重複使用。

+0

Shiva Prasad的回答和你的工作像魅力一樣。我也更瞭解Promise並處理異步,非常感謝XD。 – Sea

+0

這兩個答案之間的差異將在故障條件下出現。例如。在禁用地理位置的設備上進行測試。 –

0
votes
answers
53 views
+10

如何通過傳遞URL來在幻燈片中顯示多個圖像?

0

我的firebase數據庫結構是如何通過傳遞URL來在幻燈片中顯示多個圖像?

USERS/user_name/image/1:「url_1」,2:「url_2」,3:「url_3」,用戶最多可以上傳8張圖片。

我成功存儲了圖片和該網址。但是現在我想以幻燈片放映的形式加載回來。

如何實現進一步的步驟以及如果用戶長時間按下應該從Firebase存儲和數據庫中刪除的特定圖像,還有一個問題。

請幫助...

沙发
0
0

顯示這些網址,請使用如下代碼:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference urlsRef = rootRef.child("USERS").child("user_name").child("image"); 
ValueEventListener eventListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for(DataSnapshot ds : dataSnapshot.getChildren()) { 
      String url = ds.getValue(String.class); 
      Log.d("TAG", url); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) {} 
}; 
urlsRef.addListenerForSingleValueEvent(eventListener); 

你的輸出將是:

url_1 
url_2 
url_3 
//and so on 

因此,有網址,你需要創建一個ListView和一個適配器。而已。

作爲回答第二個問題,使用View.OnLongClickListener在coresponding ImageView和刪除特定的圖像,請使用如下代碼:

StorageReference storageRef = storage.getReference(); 

// Create a reference to the file to delete 
StorageReference imageRef = storageRef.child("images/imageName.jpg"); 

// Delete the file 
desertRef.delete().addOnSuccessListener(new OnSuccessListener<Void>() { 
    @Override 
    public void onSuccess(Void aVoid) { 
    // File deleted successfully 
    } 
}).addOnFailureListener(new OnFailureListener() { 
    @Override 
    public void onFailure(@NonNull Exception exception) { 
    // Uh-oh, an error occurred! 
    } 
}); 

而且不要忘了也刪除的網址來自Firebase數據庫的圖像如下:

rootRef.child("USERS").child("user_name").child("image").child("1").removeValue(); 

此行代碼會刪除您的第一個網址。

+0

但是,我怎樣才能給出質量幻燈片放映的效果 –

+0

這是一個很好的[教程](http://androidopentutorials.com/android-image-slideshow-using-viewpager/)。希望會幫助你。 –

0
votes
answers
31 views
+10

如何在android工作室中成功發送消息時斷開while循環

1

我正在製作Android應用程序,其中我使用Android服務發送消息while(true)。我將這些消息存儲在sqlite數據庫中。該消息應該只發送一次。我怎樣才能做到這一點?如何在android工作室中成功發送消息時斷開while循環

我的問題是,我如何獲得消息發送ID哪些消息被髮送?

這裏是我的消息代碼:

while (true) { 
    new SendJobs().execute(Numbers);       
} 
+0

你如何定義'那個消息'?也就是說,什麼使消息與其他消息一樣? –

+0

你可以檢查這[鏈接](https://stackoverflow.com/questions/12575068/how-to-get-the-result-of-onpostexecute-to-main-activity-because-asynctask-is-a)到(asyncTask) –

+0

這是我的asynctask代碼: while(true){ifId = JobNumbersId} { String [] jobsNumbers = numbers.toArray(new String [numbers.size()]); new SendJobs()。execute(jobsNumbers);其他{ 中斷; } } } –

沙发
0
0

您已經將其存儲在數據庫嗎?

所以,你可以確保信息只發送一次,通過執行以下操作

  1. 改變用布爾列數據庫(如isSent)
  2. 發送該消息後,更新列到true

所以,如果你正在運行的異步任務中獲得的信息,記住選擇isSent =「假」

對於消息發送ID

使用信息表的主鍵。

0
votes
answers
11 views
+10

的getString實現Serializable接口

0

我有課,因爲我需要它傳遞活動之間實現Serializable接口的getString實現Serializable接口

Day tempDay = new Day(); 
Intent i = new Intent(this, DayCreator.class); 
i.putExtra("DayClass", tempDay); 
startActivity(i); 

但在天類我需要閱讀一些字符串像這樣:

context.getString(R.string.sick_list); 

如果我通過構造函數傳遞給這個類的上下文像這樣:

Day tempDay = new Day(context); 

開始DayCr當我得到一個錯誤發起人活動:

Parcelable encountered IOException writing serializable object 

這使得情況,因爲上下文是不可序列化。

所以...我如何從實現Serializable的類獲取字符串?

+0

「但每天一班我需要閱讀一些字符串是這樣的「 - 恕我直言,DayCreator應該讀取該字符串(或者可能是開始」DayCreator「的任何活動)。 'Day'應該被當作某種模型對象,與字符串資源無關。 – CommonsWare

+0

在對象上保存'context'引用是非常危險的。這是一個更好的方法,使需要上下文的方法接收爲參數,使用它並返回而不保存對它的引用 –

+0

在Day類中,我有函數根據內部計算返回不同的字符串,這些字符串位於xml文件。與DayCreator沒有任何關係 – Dim

沙发
0
1

不要將上下文傳遞給POJO
一個簡單的解決方法就是讓組件讀取字符串並將其傳遞給Day對象。如下面你的組件(活動或服務)。

Day tempDay = new Day(); 
tempDay.setName((getString(R.string.app_name)); 
板凳
0
1

當你試圖通過捆綁發送整個模型對象..它應該是這樣的

Day類變化這樣

public class QrCode implements Parcelable { 

    public static final Creator<QrCode> CREATOR = new Creator<QrCode>() { 
     @Override 
     public QrCode createFromParcel(Parcel in) { 
      return new QrCode(in); 
     } 

     @Override 
     public QrCode[] newArray(int size) { 
      return new QrCode[size]; 
     } 
    }; 

    @SerializedName("sno") 
    private int mSNo; 

    public QrCode(){ 

    } 

    public QrCode(Parcel in) { 
     mSNo = in.readInt(); 
    } 


    public int getSNo() { 
     return mSNo; 
    } 

    public void setSNo(int SNo) { 
     mSNo = SNo; 
    } 
    @Override 
    public int describeContents() { 
     return hashCode(); 
    } 

    @Override 
    public void writeToParcel(Parcel parcel, int i) { 
     parcel.writeInt(mSNo); 
    } 
} 
0
votes
answers
23 views
+10

Android Studio unit testing: read data (input) file

In a unit test, how can I read data from a json file on my (desktop) file system, without hardcoding the path?

I would like to read test input (for my parsing methods) from a file instead of creating static Strings.

The file is in the same location as my unit testing code, but I can also place it somewhere else in the project if needed. I am using Android Studio.

0
votes
answers
33 views
+10

爲什麼future.get()總是爲Volley RequestFuture超時?

2

我想做一個同步排球網絡請求。我正在使用請求期貨等待響應,但future.get()通話總是超時(不管超時設置爲多長時間)。我已經單獨測試了每個組件,除了使用未來之外,沒有任何東西似乎導致了錯誤。關於我在這裏沒有錯的任何想法?爲什麼future.get()總是爲Volley RequestFuture超時?

Activity.java:persistData()

postCampaign(campaign); 

Activity.java:postCampaign()

private boolean postCampaign(final Campaign c) { 
    RequestFuture<String> future = RequestFuture.newFuture(); 
    StringRequest request = new StringRequest(Request.Method.POST, url, future, future) { 
     @Override 
     protected Map<String, String> getParams() 
     { 
      Map<String, String> params = new HashMap<>(); 
      // put data 
      return params; 
     } 
    }; 
    NetworkController.getInstance(this).addToRequestQueue(request); 

    try { 
     String response = future.get(5, TimeUnit.SECONDS); 
     Log.d("Volley", "" + response); 
     return !response.contains("Duplicate"); 
    } catch (InterruptedException|ExecutionException|TimeoutException e) { 
     Log.d("Volley", "[FAILED] " + e.getClass()); 
     return false; 
    } 
} 

奇怪的是,雖然,單步調試代碼時,看來RequestFuture的onResponse方法用適當的響應進行調用。所以看起來RequestFuture似乎沒有正確處理響應。

enter image description here

+0

您確定您確實正在向服務器發送請求嗎?看起來您使用的是HTTP協議,您是否使用過Fiddler或Wireshark來窺探正在發送的內容? – Imposter

+0

當我使用具有不同響應/錯誤偵聽器的相同字符串請求時,數據成功發佈並返回預期響應。我只需要做到這一點同步(我沒有運氣)。 –

+0

看起來您需要將請求添加到RequestQueue。 'RequestQueue隊列= Volley.newRequestQueue(getBaseContext()); queue.add(request);'。讓我們知道它是否有效。 – tsolakp

沙发
0
0

我想我已經得出結論,要麼排球是不能夠完全同步的網絡請求或至少是它是不值得的。我最終在啓動時顯示了一個微調,並在服務器響應成功消息時在Volley請求的onResponse方法中停止了它。就用戶而言,它以相同的方式工作。

0
votes
answers
22 views
+10

OpenGL ES 3.0 Java使用顏色Array繪製頂點(每個頂點顏色不同)

1

我有行,我想用數組的顏色繪製它們。OpenGL ES 3.0 Java使用顏色Array繪製頂點(每個頂點顏色不同)

顏色數組是一個FloatBuffer,每個頂點都有RGBA數據。

我嘗試了這種方式,但它不工作:

着色器代碼:

private final String vertexShaderCode = 
    "uniform mat4 uMVPMatrix;" + 
    "attribute vec4 vPosition;" + 
    "void main() {" + 
    " gl_Position = vPosition;" + 
    "}"; 

private final String fragmentShaderCode = 
    "precision mediump float;" + 
    "uniform vec4 vColor;" + 
    "void main() {" + 
    " gl_FragColor = vColor;" + 
    "}"; 

的繪圖方法:

public void draw(GL10 gl) 
{ 
    GLES30.glUseProgram(mProgram); 

    mPositionHandle = GLES30.glGetAttribLocation(mProgram, "vPosition"); 

    GLES30.glEnableVertexAttribArray(mPositionHandle); 

    GLES30.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES30.GL_FLOAT, false, vertexStride, vertexBuffer); 

    gl.glEnableClientState(GL10.GL_COLOR_ARRAY); 

    gl.glColorPointer(vertexBufferSize/4/4, GL10.GL_FLOAT, 4*4, colorBuffer); 

    GLES30.glDrawArrays(GLES30.GL_LINES, 0, vertexBufferSize/4/COORDS_PER_VERTEX); 

    GLES30.glDisableVertexAttribArray(mPositionHandle); 

    gl.glDisableClientState(GL10.GL_COLOR_ARRAY); 
} 

我用2個座標設置頂點(COORDS_PER_VERTEX = 2)。

什麼問題?

沙发
0
1

glEnableClientStateglColorPointer不是OpenGL ES的一部分。它們是Legacy OpenGL的一部分,並且已棄用Fixed Function Pipeline

如果您使用統一的變量的顏色,那麼整條生產線成爲被設置爲統一的可變顏色的彩色:

int color_loc = GLES30.glGetUniformLocation(mProgram, "vColor") 
GLES30.glUseProgram(mProgram); 
GLES30.glUniform4f(color_loc, 1.0, 0.0, 0.0, 1.0); // red 

mPositionHandle = GLES30.glGetAttribLocation(mProgram, "vPosition"); 
GLES30.glEnableVertexAttribArray(mPositionHandle); 
GLES30.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES30.GL_FLOAT, false, vertexStride, vertexBuffer); 

GLES30.glDrawArrays(GLES30.GL_LINES, 0, vertexBufferSize/4/COORDS_PER_VERTEX); 
GLES30.glDisableVertexAttribArray(mPositionHandle); 


但是,如果你要定義不同的顏色屬性爲每個頂點屬性,那麼你必須聲明一個顏色屬性,就像你爲頂點座標所做的那樣。你必須從頂點着色器的屬性傳遞給片段着色器:

private final String vertexShaderCode = 
    "uniform mat4 uMVPMatrix;" + 

    "attribute vec4 aPosition;" + 
    "attribute vec4 aColor;" + 

    "varying vec4 vColor;" + 

    "void main() {" + 
    " vColor  = aColor;" + 
    " gl_Position = aPosition;" + 
    "}"; 

private final String fragmentShaderCode = 
    "precision mediump float;" + 

    "varying vec4 vColor;" + 

    "void main() {" + 
    " gl_FragColor = vColor;" + 
    "}"; 

定義顏色屬性,你與頂點做到這一點座標屬性:

mPositionHandle = GLES30.glGetAttribLocation(mProgram, "aPosition"); 
mColorHandle = GLES30.glGetAttribLocation(mProgram, "aColor"); 

GLES30.glEnableVertexAttribArray(mPositionHandle); 
GLES30.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES30.GL_FLOAT, false, vertexStride, vertexBuffer); 

GLES30.glEnableVertexAttribArray(mColorHandle); 
GLES30.glVertexAttribPointer(mColorHandle, 4, GLES30.GL_FLOAT, false, 0, colorBuffer); 

GLES30.glDrawArrays(GLES30.GL_LINES, 0, vertexBufferSize/4/COORDS_PER_VERTEX); 
GLES30.glDisableVertexAttribArray(mPositionHandle); 
GLES30.glDisableVertexAttribArray(mColorHandle);