2016-05-31 5 views
0

親愛なるStackOverflowコミュニティ、私はいくつかの助けを求めることができますか?新しいアクティビティを開き、特定の子ビューにスクロールする方法は?

私は非常にアマチュアなコーダーであり、リファレンスドキュメントのアプリ版を開発しようとしており、検索可能にする必要があります。検索結果をドキュメントアクティビティにリンクして、ターゲットテキストまでスクロールダウンすることはできません。

私は、コーディネーターのレイアウト内のスクロールビューでドキュメントを表示するMainActivityを持っています。したがって、フローティングアクションボタンを使用できます。 content_mainレイアウトの一番上に、smoothScrollToを使ってスクロールビューの特定の子ビュー(セクション見出し)までスクロールするボタンを作成しました。彼らは正常に動作します。

しかし、文書を検索する必要があります。 SearchActivityという名前のアクティビティで、リストビュー(www.androidhive.comの例)で検索結果を与えるArrayListを作成しました。私はlistview検索結果のクリックを使ってcontent_mainレイアウトを開き、特定の子ビューまでスクロールダウンする方法を試しています。 私はSO(Click on a TextView opens new activity and jumps to a specific id; Android New Intent start particular method)で提案されているアプローチを試してみましたが、どちらもうまくいきませんでした。私はそれを管理する方法がわかっている他の何かをオンラインで見つけることができません。誰も方法を提案することはできますか?ここで私が試した一つの方法です。これはアクティビティを開きますが、スクロールしません。

ご協力いただき、ありがとうございます。

MainActivity:

public class MainActivity extends AppCompatActivity { 


Button buttonHeader3a, buttonHeader3b, buttonHeader3c, buttonHeader3d; 
ScrollView myView; 

TextView myTV; 
TextView hdr3a, hdr3b, hdr3c, hdr3d; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 

@Override 
     public void onClick(View v) { 
     Intent i = new Intent(MainActivity.this, SearchActivity.class); 
     startActivity(i); 
     } 
    }); 


    buttonHeader3a = (Button) findViewById(R.id.b1); 
    buttonHeader3b = (Button) findViewById(R.id.b2); 
    buttonHeader3c = (Button) findViewById(R.id.b3); 
    buttonHeader3d = (Button) findViewById(R.id.b4); 

    myView = (ScrollView) findViewById(R.id.myview); 
    myTV = (TextView) findViewById(R.id.ch3p16); 

    hdr3a = (TextView) findViewById(R.id.header3a); //hdr = header 
    hdr3b = (TextView) findViewById(R.id.header3b); 
    hdr3c = (TextView) findViewById(R.id.header3c); 
    hdr3d = (TextView) findViewById(R.id.header3d); 


    buttonHeader3a.setOnClickListener(new Button.OnClickListener() { 


     public final void onClick(View view) { 
      new Handler().post(new Runnable() { 
       @Override 
       public void run() { 
        myView.smoothScrollTo(0, hdr3a.getTop()); 
       } 
      }); 
     } 
    }); 

    buttonHeader3b.setOnClickListener(new Button.OnClickListener() { 

     public final void onClick(View view) { 
      new Handler().post(new Runnable() { 
       @Override 
       public void run() { 
        myView.smoothScrollTo(0, hdr3b.getTop()); 
       } 
      }); 
     } 
    }); 

    buttonHeader3c.setOnClickListener(new Button.OnClickListener() { 

     public final void onClick(View view) { 
      new Handler().post(new Runnable() { 
       @Override 
       public void run() { 
        myView.smoothScrollTo(0, hdr3c.getTop()); 
       } 
      }); 
     } 
    }); 


    buttonHeader3d.setOnClickListener(new Button.OnClickListener() { 


     public final void onClick(View view) { 
      new Handler().post(new Runnable() { 
       @Override 
       public void run() { 
        myView.smoothScrollTo(0, hdr3d.getTop()); 
       } 
      }); 
     } 
    }); 
} 

    public void onButtonLinkPrealerting (View v) { 
     if (v.getId() == R.id.buttonLinkPrealerting) { 
      Intent i = new Intent(MainActivity.this, Chapter4.class); 
      startActivity(i); 
     } 
    } 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 


// Here's where i'm trying to pick up an intent in SearchActivity and scroll down 


@Override 
protected void onNewIntent (Intent intent) { 
    super.onNewIntent (intent); 
    if(intent.getStringExtra("methodName").equals("myMethod")) { 
     myView.post(new Runnable() { 
      @Override 
      public void run() { 
       myView.smoothScrollTo(0, hdr3a.getTop()); 
      } 
     }); 
    } 
} 

// similar methods to scroll to other sections... 

}

SearchActivity:

public class SearchActivity extends Activity { 


// List view 
private ListView lv; 

// Listview Adapter 
ArrayAdapter<String> adapter; 

// Search EditText 
EditText inputSearch; 


// ArrayList for Listview 
ArrayList<HashMap<String, String>> productList; 

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


    // Listview Data 
    String products[] = { 
      "first very long string", 
      "second very long string", 
    // Several other very long strings 
      }; 

    lv = (ListView) findViewById(R.id.list_view); 
    inputSearch = (EditText) findViewById(R.id.inputSearch); 

    // Adding items to listview 
    adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.product_name, products); 
    lv.setAdapter(adapter); 

    /** 
    * Enabling Search Filter 
    * */ 
    inputSearch.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
      // When user changed the Text 
      SearchActivity.this.adapter.getFilter().filter(cs); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
             int arg3) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable arg0) { 
      // TODO Auto-generated method stub 
     } 
    }); 


    lv.setOnItemClickListener(
     new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    String a = parent.getAdapter().getItem(position).toString(); 


    if (a.equals"first very long string")) 
     { 
     Intent intent = new Intent(); 
     intent.setClass (getBaseContext(), MainActivity.class); 
     intent.putExtra("methodName", "myMethod"); 
     startActivity(intent); 
           } 

     else 

     if (a.equals"second very long string")) 

// more of the same 

      } 
      }); 
      } 
      } 


答えて

2

私があなただったら、私はあなたののロジックを移動します(MainActivity内)をonCreateに変更してください。

ドキュメントによれば、

は 状態が保存されていないことをフラグメントマネージャに通知するonNewIntent()をハンドル。新しいインテントを処理していて、 がフラグメント状態に変更されている場合は、最初に までスーパークラスにコールしてください。そうでない場合は、状態 が保存されていてもアクティビティが停止していない場合、onResume()より前に発生した onNewIntent()呼び出しを受け取り、その時点でフラグメント操作を しようとするとIllegalStateException がスローされます。状態はまだ保存されています。

したがって、単にあなたがそれを作成するときに、あなたのアクティビティのonCreateに渡されたデータを持っているかどうかを確認します。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    //All your other initialisations 

    //Get any potential intent that was passed to the activity 
    Intent intent = getIntent(); 
    if (intent != null) { 
     //Is there a string extra in that intent? 
     String extra = intent.getStringExtra("methodName"); 
     //Is that string not empty and equals what you're looking for? 
     if (!TextUtils.isEmpty(extra) && extra.equals("myMethod")) { 
     myView.post(new Runnable() { 
      @Override 
      public void run() { 
       myView.smoothScrollTo(0, hdr3a.getTop()); 
      } 
     }); 
     } 
    } 
} 
+1

それは完璧に動作します。どうもありがとうございました。 –

関連する問題