2017-12-07 17 views
-4

ここでは、MPAndroidライブラリバージョン3を使用してグループbar_chartに使用したコードです。私は下のバージョンでグループ棒グラフを試しましたが、うまく動作しますが、BarDataコンストラクタは、そして、このコードは動作しません。クラッシュやエラーログはなく、まだグラフが読み込まれており、データが表示されていません。ミリアンペアの欠陥を見つけるために私を助けてMPAndroidグループの棒グラフが表示されません

 List<BarEntry> entriesGroup1 = new ArrayList<>(); 
     List<BarEntry> entriesGroup2 = new ArrayList<>(); 
     List<BarEntry> entriesGroup3 = new ArrayList<>(); 

     entriesGroup1.add(new BarEntry(0, 8f)); 
     entriesGroup1.add(new BarEntry(1, 2f)); 
     entriesGroup1.add(new BarEntry(2, 5f)); 
     entriesGroup1.add(new BarEntry(3, 20f)); 
     entriesGroup1.add(new BarEntry(4, 15f)); 
     entriesGroup1.add(new BarEntry(5, 19f)); 

     entriesGroup2.add(new BarEntry(0, 6f)); 
     entriesGroup2.add(new BarEntry(1, 10f)); 
     entriesGroup2.add(new BarEntry(2, 5f)); 
     entriesGroup2.add(new BarEntry(3, 25f)); 
     entriesGroup2.add(new BarEntry(4, 4f)); 
     entriesGroup2.add(new BarEntry(5, 17f)); 

     entriesGroup3.add(new BarEntry(0, 9f)); 
     entriesGroup3.add(new BarEntry(1, 1f)); 
     entriesGroup3.add(new BarEntry(2, 15f)); 
     entriesGroup3.add(new BarEntry(3, 13f)); 
     entriesGroup3.add(new BarEntry(4, 40f)); 
     entriesGroup3.add(new BarEntry(5, 25f)); 

     BarDataSet set1 = new BarDataSet(entriesGroup1, "Group 1"); 
     BarDataSet set2 = new BarDataSet(entriesGroup2, "Group 2"); 
     BarDataSet set3 = new BarDataSet(entriesGroup3, "Group 3"); 

     final ArrayList<String> labels = new ArrayList<String>(); 
     labels.add("2016"); 
     labels.add("2015"); 
     labels.add("2014"); 
     labels.add("2013"); 
     labels.add("2012"); 
     labels.add("2011"); 
     IAxisValueFormatter formatter = new IAxisValueFormatter() { 

      @Override 
      public String getFormattedValue(float value, AxisBase axis) { 

       if((int) value < 0 || (int) value >= labels.size()){ 
        return ""; 
       }else{ 
        return labels.get((int) value); 
       } 
      } 

      // we don't draw numbers, so no decimal digits needed 
      @Override 
      public int getDecimalDigits() { return 0; } 
     }; 

     set1.setColor(Color.parseColor("#cd5080")); 
     set2.setColor(Color.parseColor("#0d5080")); 
     set3.setColor(Color.parseColor("#fc5080"));; 

     float groupSpace = 0.06f; 
     float barSpace = 0.02f; // x2 dataset 
     float barWidth = 0.45f; // x2 dataset 
// (0.02 + 0.45) * 2 + 0.06 = 1.00 -> interval per "group" 

     XAxis xAxis = barChart.getXAxis(); 
     xAxis.setCenterAxisLabels(true); 
     xAxis.setGranularity(1f); // minimum axis-step (interval) is 1 
     xAxis.setValueFormatter(formatter); 

     BarData data = new BarData(set1, set2, set3); 
     data.setBarWidth(barWidth); // set the width of each bar 
     barChart.setData(data); 
     barChart.groupBars(2016, groupSpace, barSpace); 
     barChart.invalidate(); // refresh 

     barChart.animateY(5000); 

を注意:私は、新しい質問をすることを禁止していますので、私は私の現在の質問を編集しています。しかし、それは私のために重要です。みんな、ありがとう。

+0

プロジェクト内のuに、実行中のすべてのactivitysのリストを与えます。私のプロジェクトは約87の活動ページを持っているので、onPauseとonResumeを含むようにすべてのアクティビティで編集する必要がありますか?それとも別の方法ですか? –

+0

これをチェックしてくださいhttps://tips.androidhive.info/2015/04/android-how-to-check-if-the-app-is-in-background-or-foreground/ –

+2

'...ほぼ87個の活動ページ...「うわー!なぜそんなに多くのアクティビティ、あなたはフラグメントと1つ(またはいくつか)のアクティビティを使うことができますか? –

答えて

1

カウンタが0であれば、Applicationクラスを作成し、フォアグラウンド活動のカウンタを追加し、あなたの質問に答えるためにEDIT

、Applicationクラスがにシングルトンであるあなたのactivityがバックグラウンドで

class MyApp extends Application{ 
public int foregroundActivities = 0 ; 

@override 
public void onCreate(){ 
    super.onCreate(); 
    this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { 

       @Override 
       public void onActivityStarted(Activity activity) { 
        foregroundActivities++; 
       } 

       @Override 
       public void onActivityStopped(Activity activity) { 
        foregroundActivities--; 
       } 
     } 
    } 
} 

であることを意味します上記のようにアクティビティライフサイクルコールバックを登録することができます。このコールバックは、87のアクティビティのすべてによってトリガされます。あなたの87 activitiesのいずれかが開始されている場合は

と仮定、 、それはactivityが閉じている場合は、それがバックにフォアグラウンド活動のカウントをデクリメントなるonActivityStopped()を呼び出します、フォアグラウンド活動のカウントが1なりonActivityStarted()メソッドを呼び出します0

だからあなたはあなたが活動hasWindowFocus()ブールメソッドを使用することができ、アプリケーションがカウンターに基づいてフォアグラウンドまたはバックグラウンドにあるかどうか

if(applicationInstance.foregroundActivities > 0){ 
    //App is in foreground 
}else{ 
    //App is in background 
} 
+0

私はすでにアプリケーションクラスを持っています。 oncreateで、それは私に新しく見えます。このコードの流れを説明できますか? –

+0

私はアクティビティライフサイクルコールの機能をアプリケーションクラス –

+0

で教えてくれました。ありがとうございました。私は最後の活動を終えて以前の活動に戻るとどうなるでしょうか?それはカウント0または1としてマークしていますか? –

0

を検出することができます。フォーカスがある場合はアクティビティからポップアップを表示し、そうでなければ通知を表示するだけです。

+0

それは私のためにうまく動作しません。あなたの貴重な時間のおかげでありがとう –

+0

ありがとう。私は新しい質問をするのが禁止されているので質問を変えた。そして、今私にとって重要な疑念は、あなたが理解できることを願っています。 –

1

これは私の答えではありません、私はこのquesを見て、私のアプリでimplenetedそれは魅力的なように働いた。元の回答へのリンクが見つかりませんでしたので、私が使ったコードを投稿しています。 あなたはActivityLifecycleCallbacksを使用することができます。

public class AppTransitionStatus implements Application.ActivityLifecycleCallbacks { 

private static final long MAX_BACKGROUND_TIME = 2000; 
private Timer timer; 
private TimerTask task; 
private boolean isBackground; 

private final Transition transition; 

private void goToForeground(Activity iActivity) { 
    transition.appToForeground(iActivity); 
} 

private void goToBackground() { 
    transition.appToBackground(); 
} 

private void stopTimer() { 
    if (task != null) task.cancel(); 
    if (timer != null) timer.cancel(); 
} 

public AppTransitionStatus(@NonNull Transition transition) { 
    this.transition = transition; 
} 

@Override 
public void onActivityCreated(Activity activity, Bundle bundle) { 

} 

@Override 
public void onActivityStarted(Activity activity) { 

} 

@Override 
public void onActivityResumed(Activity activity) { 
    if (isBackground) { 
     goToForeground(activity); 
    } 
    stopTimer(); 
    isBackground = false; 
} 

@Override 
public void onActivityPaused(Activity activity) { 
    timer = new Timer(); 
    task = new TimerTask() { 
     public void run() { 
      isBackground = true; 
      goToBackground(); 
     } 
    }; 
    timer.schedule(task, MAX_BACKGROUND_TIME); 
} 

@Override 
public void onActivityStopped(Activity activity) { 

} 

@Override 
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { 

} 

@Override 
public void onActivityDestroyed(Activity activity) { 

} 

public interface Transition { 
    void appToForeground(Activity iActivity); 

    void appToBackground(); 
} 
} 

そして、あなたのアプリケーションクラスでこれを登録することができます

registerActivityLifecycleCallbacks(new AppTransitionStatus(new AppTransitionStatus.Transition() { 
     @Override 
     public void appToForeground(Activity iActivity) { 

      Log.d("Transition", "App in Foreground"); 

     } 

     @Override 
     public void appToBackground() { 
      Log.d("Transition", "App in Background"); 
     } 
    })); 
+0

あなたの貴重な時間に感謝します。私は新しい質問をするのが禁止されているので質問を変えました。そして、今私にとって重要な疑念は、あなたが理解できることを願っています。 –

1

使用ブローコード:

public boolean isActivityRunning(Context context) { 
    boolean isActivityFound = false; 
    ActivityManager activityManager = (ActivityManager)context.getSystemService (Context.ACTIVITY_SERVICE); 
    List<ActivityManager.RunningTaskInfo> activitys = activityManager.getRunningTasks(Integer.MAX_VALUE); 

    for (int i = 0; i < activitys.size(); i++) { 
     if (activitys.get(i).topActivity.toString().equalsIgnoreCase("ComponentInfo{com.example.testapp/com.example.testapp.Your_Activity_Name}")) { 
      isActivityFound = true; 
     } 
    } 
    return isActivityFound; 
} 

ここcom.example.testappがあなたのパッケージです名前

マニフェストにアクセス許可を追加する必要があります..

<uses-permission android:name="android.permission.GET_TASKS"/> 

実行中のアクティビティは、名前を使用して実行されますが、要件として変更されます。

UPDATE

public static ArrayList<ActivityInfo> getAllRunningActivities(Context context) { 
try { 
    PackageInfo pi = context.getPackageManager().getPackageInfo(
      context.getPackageName(), PackageManager.GET_ACTIVITIES); 

    return new ArrayList<>(Arrays.asList(pi.activities)); 

} catch (PackageManager.NameNotFoundException e) { 
    e.printStackTrace(); 
    return null; 
} 
} 

このメソッドは、私はこの答えを見てきました@Nilu

+0

完全なアプリケーションで動作しますか? –

+0

はいこれは、どのクラスでも実行を検出するために機能します。 –

+0

"ComponentInfo {com.example.testapp/com.example.testapp.Your_Activity_Name}"に使用されているものです。私はここにすべての活動名を追加する必要がありますか?しかし、私は別の解決策が必要です。 –

関連する問題